通过 std::function 包装重载函数
Wrap overloaded function via std::function
我有一个重载函数,我想用 std::function 包装它传递它。GCC4.6没有找到"匹配函数"。虽然我确实在这里发现了一些问题,但答案并不像我想要的那么清楚。有人可以告诉我为什么下面的代码不能扣除正确的重载以及如何(优雅地)解决它吗?
int test(const std::string&) {
return 0;
}
int test(const std::string*) {
return 0;
}
int main() {
std::function<int(const std::string&)> func = test;
return func();
}
这是模棱两可的情况。
要消除歧义,请使用显式强制转换为:
typedef int (*funtype)(const std::string&);
std::function<int(const std::string&)> func=static_cast<funtype>(test);//cast!
现在,编译器将能够根据强制转换中的类型消除情况的歧义。
或者,您可以执行以下操作:
typedef int (*funtype)(const std::string&);
funtype fun = test; //no cast required now!
std::function<int(const std::string&)> func = fun; //no cast!
那么为什么std::function<int(const std::string&)>
不能按照上面funtype fun = test
的工作方式工作呢?
答案是,因为std::function
可以用任何对象初始化,因为它的构造函数是模板化的,它独立于您传递给std::function
的模板参数。
相关文章:
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 可以打印矢量和矢量中的矢量的非重载C++函数
- 错误 没有与参数列表匹配的重载函数"getline"实例
- 使用模板重载函数
- C++线程中,没有重载函数接受 X 参数
- std::vector 没有重载函数的实例与参数列表匹配
- C++重载函数,一个采用基类的参数,另一个采用派生类的参数
- 错误:无法解析对重载函数的引用;你的意思是调用它吗?
- 对重载函数find_first_not_of的不明确调用
- 如何从重载解析中删除重载函数?
- CUDA:重载函数"isnan"的多个实例
- C++派生类重载函数(带有 std::function 参数)不可见
- 避免在人为的重载函数调用中拼写出类型
- C++:如何为多个重载函数保留通用代码路径?
- 什么时候可以使用常量装饰调用我的重载函数?
- 尝试使用谓词函数会导致错误:"std::sort"未找到匹配的重载函数
- std::调用,未找到匹配的重载函数
- 为什么在传递长整型时调用具有两个双精度类型的参数的重载函数?
- 为什么使用不匹配的参数调用重载函数仍然有效
- 如何通过签名作为模板参数来解决重载函数?