使用std :: function进行隐式转换

met*_*tal 7 c++ overloading implicit-conversion c++11

可能重复:
为什么我的C++编译器不能推导出boost函数的模板参数?
std :: function的模板参数(签名)是不是它的类型?

我有以下内容:

#include <functional>

void Foo( std::function<void()>    );
void Foo( std::function<void(int)> );
void Bar();

int main()
{
  Foo( Bar );     // Error: ambiguous
  Foo( [](){} );  // Error: ambiguous

  Foo( std::function<void()>( Bar    ) ); // Ok
  Foo( std::function<void()>( [](){} ) ); // Ok
}
Run Code Online (Sandbox Code Playgroud)

我可以在main()中使用前两行而不使用最后两行中的函数样式转换吗?也许使用std :: enable_if解决方案?

n. *_* m. 5

任何调用美孚与一个参数,它是不完全的一个std::function<void()>,并std::function<void(int)>会导致一个悬而未决的过载。甚至像Foo(1)or 之类的愚蠢的东西Foo("abc")。这是因为 的构造函数std::function被模板化并接受任何类型。std::function<void()>(1)会在实例化时失败,但重载解析发生在实例化之前。

所以不,您需要以一种或另一种方式提供与其中一个功能的完全匹配。您可以引入其他重载的 Foo 实例,例如

void Foo(void (*)());
void Foo(void (*)(int));
Run Code Online (Sandbox Code Playgroud)

这将导致更好的匹配,歧义将不再存在。


归档时间:

查看次数:

3538 次

最近记录:

14 年,3 月 前