fork(2) download
  1. #include <iostream>
  2. #include <vector>
  3. #include <memory>
  4. #include <functional>
  5. using namespace std;
  6. template<class S> class Foo;
  7.  
  8. template<class Ret, class Arg, class... Args>
  9. class Foo<Ret(Arg*, Args...)>
  10. {
  11. public:
  12. template<class FUNC>
  13. Foo(FUNC func)
  14. {
  15. cout << "func" << endl;
  16. }
  17. Foo(Ret(Arg::*method)(Args...)) { cout << "fptr" << endl; }
  18. };
  19. class EMPTY {};
  20. class Bar
  21. {
  22. public:
  23. Bar() {}
  24. void XD(int a) {}
  25. };
  26. void func1(Bar*, int)
  27. {
  28.  
  29. }
  30. void func2(int*, int)
  31. {
  32.  
  33. }
  34. void func3(int, int)
  35. {
  36.  
  37. }
  38. void func4(EMPTY*, int)
  39. {
  40.  
  41. }
  42. int main()
  43. {
  44. //Foo<void(int*, int)> fff(bbb); //0. 這到底是為什麼? 他始終會想先走不用推導的版本
  45. Foo<void(Bar*, int)> obj(&Bar::XD); //1. 因為他是pointer to member所以直接走不用推導的版本
  46. Foo<void(Bar*, int)> obj2(func1); //2 因為是非pointer to member所以只能走另一個, 透過推導
  47. Foo<void(EMPTY*, int)> obj3(func4); //3. 原因跟2 一樣
  48. return 0;
  49. }
  50.  
Success #stdin #stdout 0s 3460KB
stdin
Standard input is empty
stdout
fptr
func
func