std :: function [duplicate]的隐式转换

||                                                                                                                   这个问题已经在这里有了答案:                                                      
已邀请:
        使用不完全是
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); }
}
    

要回复问题请先登录注册