fork download
  1. #include <iostream>
  2. #include <type_traits>
  3.  
  4. struct A { void reset() { std::cout << "reset A" << std::endl; } };
  5. struct B { void reset() { std::cout << "reset B" << std::endl; } };
  6.  
  7. struct X :public A{};
  8.  
  9. template <typename T, typename R, typename BT>
  10. R call_if_possible_impl(T & obj, R(BT::*mf)(), std::false_type){}
  11.  
  12. template <typename T, typename R, typename BT>
  13. R call_if_possible_impl(T & obj, R(BT::*mf)(), std::true_type)
  14. {
  15. return (obj.*mf)();
  16. }
  17.  
  18. template <typename T, typename R, typename BT>
  19. R call_if_possible(T & obj, R(BT::*mf)())
  20. {
  21. return call_if_possible_impl(obj, mf, typename std::is_base_of<BT, T>::type());
  22. }
  23.  
  24. int main()
  25. {
  26. X x;
  27.  
  28. call_if_possible(x, &A::reset);
  29. call_if_possible(x, &B::reset);
  30. }
Success #stdin #stdout 0s 3456KB
stdin
Standard input is empty
stdout
reset A