FLA*_*LAG 9 c++ overloading c++11
如何防止std::functionC bool++函数重载中的转换?\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\nRun Code Online (Sandbox Code Playgroud)\n我想通过而不是\xef\xbc\x8c来调用#2,但结果是调用了#1Object(Println)Object(std::function<int(int*, int)>(Println))
我应该如何实现这个目标?
\nMSa*_*ers 12
现代 C++ 解决方案是
Object::Object(std::invocable<int*, int> auto f)
std::function<int(int*, int)>您并不关心 f 的类型到底是什么 - 从您考虑和可互换的事实中可以清楚地看出这一点int(*)(int*, int)>。std::invocable比这更笼统一点:它说任何可调用的东西都可以。lambda 也可以工作。
添加函数指针构造函数怎么样?
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)
| 归档时间: |
|
| 查看次数: |
301 次 |
| 最近记录: |