【发布时间】:2012-05-03 22:51:12
【问题描述】:
我可以使用可变参数模板而不使用模板参数作为函数参数吗?
当我使用它们时,它会编译:
#include <iostream>
using namespace std;
template<class First>
void print(First first)
{
cout << 1 << endl;
}
template<class First, class ... Rest>
void print(First first, Rest ...rest)
{
cout << 1 << endl;
print<Rest...>(rest...);
}
int main()
{
print<int,int,int>(1,2,3);
}
但是当我不使用它们时,它不会编译并抱怨歧义:
#include <iostream>
using namespace std;
template<class First>
void print()
{
cout << 1 << endl;
}
template<class First, class ... Rest>
void print()
{
cout << 1 << endl;
print<Rest...>();
}
int main()
{
print<int,int,int>();
}
不幸的是,我想作为模板参数提供的类是不可实例化的(它们具有在模板函数内部调用的静态函数)。 有没有办法做到这一点?
【问题讨论】:
-
如果你需要一个给定类型的 unevalated 表达式,你可以使用
std::declval<T>()。适用于任何T,无论其是否可构造。 -
至于为什么无参数版本不起作用:没有参数,
print<int, {}>和print<int>的重载同样好,而有参数print<int>(3)比@987654328更好的匹配@(其中{}表示“无”)。正如 CatPusPus 所建议的那样,不使用重载是标准方法;而且由于您无论如何都没有推断出您的论点,所以这是最简单的解决方案。 -
我打算发布一个答案,但 n.m.已经发过了。
标签: c++ templates c++11 variadic-templates function-parameter