[英]Call a variadic function using a variable template
请考虑以下代码:
template<typename T, typename... Args>
void foo(const Args&... args)
{
//...
}
template<typename... Args>
auto fooChar = foo<char, Args...>;
template<typename... Args>
auto fooInt = foo<int, Args...>;
为了能够使用这些变量模板,我需要明确地键入模板参数,如下所示:
fooChar<int, char, const char*>(5, 'a', "bar");
但是,在标准的可变参数函数调用中,模板参数是基于实际的函数参数类型而隐式推导出来的。 换句话说,我希望能够像这样使用变量模板,但额外的间接级别似乎限制了这个:
fooChar(5, 'a', "bar");
显然,我可以简单地定义简单的包装函数而不是变量模板,如下所示:
template<typename... Args>
void fooChar(const Args&... args)
{
return foo<char>(args...);
}
template<typename... Args>
void fooInt(const Args&... args)
{
return foo<int>(args...);
}
但总的来说,它看起来更笨重,更不方便。 那么,在使用变量模板时,有什么办法可以达到相同的效果吗? 如果没有,为什么编译器无法将参数“转发”到别名函数,从而推导出可变参数类型?
你可以在一个结构中包装foo()
:
template <class T>
struct fooWrapper {
template <class... Args>
void operator()(Args const&... args) const {
foo<T>(args...);
}
};
现在让你的变量模板成为这个包装器的实例:
fooWrapper<char> fooChar;
fooWrapper<int> fooInt;
有了额外的好处,你可以将fooChar
传递给一个功能模板,因为它本身不是一个功能模板。
需要一个包装器:
#include <utility>
template<typename T, typename... Args>
void foo(const Args &&... args)
{
//...
}
template<typename ...Args>
inline void fooChar(const Args && ...args)
{
foo<char>(std::forward<Args>(args)...);
}
希望您的编译器能够优化函数调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.