问题描述
||
这个问题已经在这里有了答案:
解决方法
使用不完全是
std::function<void()>
和std::function<void(int)>
之一的参数对Foo的任何调用都将导致无法解决的重载。甚至像Foo(1)
或Foo(\"abc\")
之类的愚蠢事物。这是因为std::function
的构造函数是模板化的,可以接受任何类型。 std::function<void()>(1)
在实例化时会失败,但是重载解析会在实例化之前发生。
因此,不行,您需要以一种或另一种方式与这些功能之一进行完全匹配。您可能会引入Foo的其他重载实例,例如
void Foo(void (*)());
void Foo(void (*)(int));
这将导致更好的匹配,并且不再存在歧义。
, 在C ++ 0x中,可以使用SFINAE使其正常工作。但是,据我所知,MSVC的SFINAE错误使它们不可能实现,而且GCC的库实现者似乎没有注意到,因此不幸的是,此方法不起作用。
我猜你也可以尝试一些make_function
。请问我的可变参数模板,已经有一段时间了。
template<typename T> struct function_proxy {
T f;
template<typename Ret,typename... T> operator std::enable_if<std::is_same<Ret,decltype(f(std::declval<T>()...))>::value,std::function<Ret(T...)>>::type () {
return std::function<Ret(T...)>(f);
}
};
template<typename T> function_proxy<T> make_function(T&& t) {
return function_proxy { std::forward<T>(t); }
}