c++ - 取函数模板重载的地址

标签 c++ templates c++11 overloading function-pointers

我的代码依赖于 SFINAE 和默认模板参数。它按预期工作,除了最后两行注释:

#include <tuple>
#include <iostream>
using namespace std;

template<typename T> void push(T val){
    cout<<val<<endl;
}

template<typename T> T to(){
    T dummy;
    cin>>dummy;
    return dummy;
}

template<typename T, T> class function_proxy{
    static_assert(sizeof(T)!=sizeof(T), "Error: function_proxy works with functions (duh)");
};

template<typename Return, typename... Args, Return(*func)(Args...)> class function_proxy<Return(*)(Args...), func>{
    static Return call(Args... args){
        return func(args...);
    }
    template<typename... retrieved> static Return call(retrieved... read){
        return call(read..., to<typename tuple_element<sizeof...(read), tuple<Args...> >::type >());
    }
public:
    template<typename Ret=Return, typename enable_if<!is_void<Ret>::value, int>::type=0>
    static int wrapper(){
        push(call());
        return 1;
    }

    template<typename Ret=Return, typename enable_if<is_void<Ret>::value, int>::type=0>
    static int wrapper(){
        call();
        return 0;
    }
};

int f(int arg){ return arg*3; }
void g(){ cout<<"g does nothing"<<endl; }

int main(){
    //SFINAE works nicely
    function_proxy<decltype(&f), &f>::wrapper();
    function_proxy<decltype(&g), &g>::wrapper();
    //Here it doesn't, even though there should be no ambiguity:
    //function_proxy<decltype(&f), &f>::wrapper;
    //function_proxy<decltype(&g), &g>::wrapper;
}

您可以看到,当我调用模板函数时,SFINAE 完成了它的工作。但是当我尝试获取唯一不会格式错误的函数的地址时,g++ 提示它无法解析重载函数的地址。

有没有办法在不显式告诉这些重载函数的第一个模板参数的情况下解决这个问题?从理论上讲,这是多余的。此外,我使用此帮助程序类的代码非常通用,因此这里的返回类型 fg 可能不太容易获取。

最佳答案

SFINAE 仅在重载决议期间适用,如果没有函数调用,则不存在重载决议。

关于c++ - 取函数模板重载的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10288855/

相关文章:

c++ - 从方法 C++ 返回对象

c++ - 为什么obj的私有(private)值可以被类实例改变?

c++ - 如何确定将哪种类型传递给模板定义的函数?

c++ - 在条件变量上调用 notify 时互斥量是否被解锁?

c++ - 如何将cpp文件中的静态函数暴露给其他文件

c++ - 如何为 waitKey() 动态分配延迟值以便获得正确的 fps?

python - yesno 过滤器的复杂比较?

c++ - 比较两个不同的枚举时,是否有避免警告的正确方法?

c++ - 图像处理中的并发设计

c++11 - 为什么调用 lambda 函数比调用常规函数更快