请考虑以下代码:
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...);
}
但总的来说,它看起来更笨重,更不方便。那么,在使用变量模板时,有什么办法可以达到相同的效果吗?如果没有,为什么编译器无法将参数“转发”到别名函数,从而推导出可变参数类型?
答案 0 :(得分:1)
您可以将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
传递给一个功能模板,因为它本身不是一个功能模板。
答案 1 :(得分:-1)
需要一个包装器:
#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)...);
}
希望您的编译器能够优化函数调用。