具有功能的模板包扩展

Template pack expansion with functions

下面的代码按预期工作。

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

struct 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>();

您不能部分特化函数模板 - 只能特化 class 个模板。

但在此示例中,您实际上不必这样做。您已经在使用 折叠表达式 ,还包括第一种类型:

struct B 
{
    template<typename T>
    void do_real_stuff() {}

    template <typename... Types>
    void DoStuff()
    {
         (do_real_stuff<Types>(), ...);
    }
};