可变模板函数的包装模板
我正在为包装器实现一个模板,如下所示:
从上面的链接中取得的包装是:
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
的正确实例。
上一篇: Template of wrapper for variadic template functions
下一篇: Compilation error when passing variadic args to a template function