如何防止 c++ 函数重载中 std::function 到 bool 转换?

FLA*_*LAG 9 c++ overloading c++11

如何防止std::functionC bool++函数重载中的转换?\n例如

\n
class Object final {\n    \npublic:\n    Object(bool boolean) : type_(22)  {}  //#1\n    Object(const std::function<int(int*, int)>  value) : type_(11) {}  //#2\n    \n    int rettype() { return type_; };\n    \nprivate:\n    int type_;\n};\n\n\nint Println(int *args, int nargs) {\n  printf("Println\\n");\n  return 0;\n}\n\nint main() {\n    cout << Object(Println).rettype() << endl; // 22\n    cout << Object(std::function<int(int*, int)>(Println)).rettype() << endl; // 11\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n

我想通过而不是\xef\xbc\x8c来调用#2,但结果是调用了#1Object(Println)Object(std::function<int(int*, int)>(Println))

\n

我应该如何实现这个目标?

\n

MSa*_*ers 12

现代 C++ 解决方案是 Object::Object(std::invocable<int*, int> auto f)

std::function<int(int*, int)>您并不关心 f 的类型到底是什么 - 从您考虑和可互换的事实中可以清楚地看出这一点int(*)(int*, int)>std::invocable比这更笼统一点:它说任何可调用的东西都可以。lambda 也可以工作。


Nel*_*eal 1

添加函数指针构造函数怎么样?

Object(int (*value)(int*, int)) : Object(std::function<int(int*, int)>(value)) {}
Run Code Online (Sandbox Code Playgroud)

您还可以为函数类型设置别名:

using FunctionType = int (*)(int*, int);
Object(FunctionType value) : Object(std::function<int(int*, int)>(value)) {}
Run Code Online (Sandbox Code Playgroud)