可变参数模板函数的包装器模板

时间:2018-03-07 17:16:26

标签: c++ variadic-templates variadic-functions function-template

我正在为包装器实现模板,如:

从上面的链接中获取的包装是:

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)无法确定,除非给出模板函数的参数&#39;类型。问题是信息是在编译时存在的,即。 foo2是用int调用的,所以类型是int(int)等。是不是有某种方式来表达事物,以便用参数的类型确定函数的类型?

简化

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

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的正确实例。

0 个答案:

没有答案