fork(1) download
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. struct Foo {};
  5.  
  6. int foo(int) { return 0; }
  7. Foo foo(double) { return Foo(); }
  8. // no foo(const char*)
  9.  
  10. struct Bar { Bar(bool) {} };
  11. ostream& operator << (ostream& ost, Bar&& bar) { return ost << "BARR"; }
  12.  
  13. Bar operator , (Foo&&, bool) { return Bar(true); } // ВНЕЗАПНО!
  14.  
  15. // требование к then-ветке функции: чтобы была определена функция foo(T)
  16.  
  17. template<class T> auto test1(T&& t) -> decltype(foo(t), true) { return true; }
  18. auto test1(...) -> bool { return false; }
  19.  
  20. template<class T> auto test2(T&& t) -> decltype(foo(t), void(0), true) { return true; }
  21. auto test2(...) -> bool { return false; }
  22.  
  23.  
  24. int main()
  25. {
  26. cout << boolalpha << test1(1) << " " << test1(1.) << " " << test1("") << endl; // true BARR false
  27. cout << boolalpha << test2(1) << " " << test2(1.) << " " << test2("") << endl; // true true false
  28. return 0;
  29. }
  30.  
Success #stdin #stdout 0.01s 3344KB
stdin
Standard input is empty
stdout
true BARR false
true true false