具有功能的模板包扩展



下面的代码按预期工作。

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>(), ...);
}
};

最新更新