fork download
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4.  
  5. class function_set {
  6. public:
  7. static bool overload( const char * s ) { cout << "一つ目 " << s << " で呼ばれた" << endl; return true; }
  8. static bool overload( string s ) { cout << "一つ目 " << s << " で呼ばれた" << endl; return false; }
  9. };
  10.  
  11. // [&] で呼び出したスコープで有効なものを可視にしてる
  12. // 関数の呼び出し処理の前や後に内部の処理を入れたかった
  13. #define probe3( funct, ... ) \
  14. [&]() -> decltype( funct( __VA_ARGS__ ) ) { \
  15. if( !has_dummy_result ) { \
  16. return funct( __VA_ARGS__ ); \
  17. } \
  18. return dummy_result; \
  19. }()
  20.  
  21. bool dummy_result = false;
  22. bool has_dummy_result = false;
  23. void clear_dummy_result() { has_dummy_result = false; }
  24. void set_dummy_result( bool result ) { dummy_result = result; has_dummy_result = true; }
  25.  
  26. void probe3_test() {
  27. cout << "一つ目 " << boolalpha << probe3( function_set::overload, "aaaa" ) << " を返した" << endl;
  28. cout << "二つ目 " << boolalpha << probe3( function_set::overload, (string)"aaaa" ) << " を返した" << endl;
  29. }
  30.  
  31. int main() {
  32. clear_dummy_result();
  33. probe3_test();
  34. set_dummy_result( false );
  35. probe3_test();
  36. set_dummy_result( true );
  37. probe3_test();
  38. }
Success #stdin #stdout 0s 3432KB
stdin
Standard input is empty
stdout
一つ目 aaaa で呼ばれた
一つ目 true を返した
一つ目 aaaa で呼ばれた
二つ目 false を返した
一つ目 false を返した
二つ目 false を返した
一つ目 true を返した
二つ目 true を返した