通过 std::function 包装重载函数

Wrap overloaded function via std::function

本文关键字:重载 函数 包装 function std 通过      更新时间:2023-10-16

我有一个重载函数,我想用 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的模板参数。