fork download
  1. template <class Derived>
  2. class base
  3. {
  4. public:
  5. virtual ~base() = default;
  6. auto operator()()
  7. const noexcept { return dynamic_cast<const Derived&>(*this)(); }
  8. };
  9.  
  10. class derived : public base<derived>
  11. {
  12. public:
  13. auto operator()()
  14. const noexcept { return 0; }
  15. };
  16.  
  17. template <class A, class B>
  18. class expr : public base<expr<A, B>>
  19. {
  20. const A m_a;
  21. const B m_b;
  22. public:
  23. explicit expr(const A a, const B b)
  24. noexcept : m_a(a), m_b(b) {}
  25.  
  26. auto operator()()
  27. const noexcept { return m_a() + m_b(); }
  28. };
  29.  
  30. template <class D1, class D2>
  31. auto foo(const base<D1>& d1, const base<D2>& d2)
  32. noexcept { return expr<base<D1>, base<D2>>{d1, d2}; }
  33.  
  34. int main()
  35. {
  36. auto d = derived{};
  37. auto e = foo(d, d);
  38. return e();
  39. }
  40.  
Runtime error #stdin #stdout #stderr 0s 3268KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
terminate called after throwing an instance of 'std::bad_cast'
  what():  std::bad_cast