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

Wrap overloaded function via std::function

提问人:abergmeier 提问时间:4/12/2012 更新时间:4/12/2012 访问量:3261

问:

我有一个重载函数,我想用 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();
}
C++ C++11 重载

评论


答:

23赞 Nawaz 4/12/2012 #1

这是模棱两可的情况。

若要消除歧义,请使用显式强制转换:

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::functionstd::function

评论

1赞 Anonymous 4/12/2012
请使用旧式铸件代替。static_cast
0赞 Nawaz 4/12/2012
@Anonymous:是的。但我想简短一点。无论如何,我编辑了它,使它看起来像 C++ 风格!
0赞 abergmeier 4/12/2012
多么具有讽刺意味的是 - 你必须使用函数指针来获取 std::function,这是为了摆脱函数指针而引入的:)感谢
1赞 David Rodríguez - dribeas 4/12/2012
@LCIDFire:引入不是为了摆脱函数指针,而是为了提供更通用的解决方案。您可以使用和使用任何函数指针、lambda、函子(包括绑定器)......std::functionstd::function