可变模板函数的包装模板

我正在为包装器实现一个模板,如下所示:

  • 用函数作为模板参数的C ++函数调用包装器
  • 用可变参数模板在C ++中包装函数指针
  • 从上面的链接中取得的包装是:

    template<typename Fn, Fn fn, typename... Args>
    typename std::result_of<Fn(Args...)>::type
    wrapper(Args&&... args) {
    return fn(std::forward<Args>(args)...);
    }
    #define WRAPPER(FUNC) wrapper<decltype(&FUNC), &FUNC>
    

    给定两个函数foo和foo2:

    int foo (int a) {return a};
    
    template <class T>
        T foo2(T a)
        {
            return a;
        }
    
    WRAPPER(foo)(4) /*Works*/
    WRAPPER(foo2)(4) /*Doesn't work*/
    

    我知道这是因为decltype(&FUNC)不能被确定,除非给模板函数的参数类型。 问题是这些信息在编译时存在,即。 foo2是用int来调用的,所以它的类型是int(int)等等。是不是有某种表达方式来表示函数的类型是由参数的类型决定的?

    简单化

    我删除了上面代码中的模板调用以隔离包装部分,因此可以在相同的“级别”上访问函数及其参数:

    template<class F, typename... Args>
        typename std::result_of<F(Args...)>::type wrapper2(F&& fn, Args&&... args)
        {
            return fn(std::forward<Args>(args)...);
        }
    wrapper2(foo, 4) /*works*/
    wrapper2(foo2, 4) /* the instance of foo2 to create cannot be determined */
    

    给定参数列表的类型,包装应该能够创建foo2的正确实例。

    链接地址: http://www.djcxy.com/p/51587.html

    上一篇: Template of wrapper for variadic template functions

    下一篇: Compilation error when passing variadic args to a template function