fork download
  1.  
  2. #include <iostream>
  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. typename std::enable_if<std::is_base_of<BT, T>::value, R>::type
  11. call_if_possible(T & obj, R(BT::*mf)())
  12. {
  13. return (obj.*mf)();
  14. }
  15.  
  16. template <typename T, typename R, typename BT>
  17. typename std::enable_if<!std::is_base_of<BT, T>::value, R>::type
  18. call_if_possible(T & obj, R(BT::*mf)()) { }
  19.  
  20. int main()
  21. {
  22. X x;
  23.  
  24. call_if_possible(x, &A::reset);
  25. call_if_possible(x, &B::reset);
  26. }
  27.  
Success #stdin #stdout 0s 3412KB
stdin
Standard input is empty
stdout
reset A