fork download
  1. #include <iostream>
  2. #include <type_traits>
  3.  
  4. struct Foo {};
  5.  
  6. struct Bar {};
  7.  
  8. struct Baz : Foo, Bar
  9. {
  10. public:
  11. virtual void something(const Bar &bar)
  12. { std::cout << "Bar\n"; }
  13.  
  14. template <class T, class = typename std::enable_if<std::is_convertible<const T&, const Foo&>::value && !std::is_convertible<const T&, const Bar&>::value>::type>
  15. void something (const T &foo)
  16. { something_impl(static_cast<const Foo&>(foo)); }
  17.  
  18. private:
  19. virtual void something_impl(const Foo &foo)
  20. { std::cout << "Foo\n"; }
  21.  
  22. };
  23.  
  24. int main()
  25. {
  26. Baz baz;
  27. baz.something(baz);
  28.  
  29. Foo foo;
  30. baz.something(foo);
  31.  
  32. Bar bar;
  33. baz.something(bar);
  34. }
Success #stdin #stdout 0s 3296KB
stdin
Standard input is empty
stdout
Bar
Foo
Bar