下面的代码按预期工作。
struct A
{
template<typename T>
void do_real_stuff() {}
template <typename... Types>
struct DoStuff;
template <typename Head, typename... Tail>
struct DoStuff<Head, Tail...>
{
DoStuff(A &base)
{
base.do_real_stuff<Head>();
(base.do_real_stuff<Tail>(), ...);
}
};
};
结构A允许我将其称为:
A a;
DoStuff<int,double,string>(a);
但我不明白为什么我不能用同样的模式来处理函数而不是结构。
struct B
{
template<typename T>
void do_real_stuff() {}
template <typename... Types>
void DoStuff();
template <typename Head, typename... Tail>
void DoStuff<Head, Tail...>()
{
do_real_stuff<Head>();
(do_real_stuff<Tail>(), ...);
}
};
因为我想这样称呼它:
A a;
a.DoStuff<int,double,string>();
不能部分专门化函数模板,只能专门化类模板。
但在这个例子中,你实际上不必这么做。您已经在使用折叠表达式,只是还包括第一种类型:
struct B
{
template<typename T>
void do_real_stuff() {}
template <typename... Types>
void DoStuff()
{
(do_real_stuff<Types>(), ...);
}
};