在 C++ 中为可变参数模板定义子包

Define subpackages for variadic templates in C++

我有类似的基于可变参数模板的东西:

class MyClass {
  public:
    template <typename... OtherTs>
    typename std::enable_if<sizeof...(OtherTs) == 0>::type Setup() {}

    template <typename T, typename...OtherTs>
    void Setup() {
      DoSomeStuff(new T());
      Setup<OtherTs>();
    }
};

它运行良好,我可以根据其他 类 设置 MyClass 的实例,例如 myClass.Setup<A,B,C>()。 我现在想做的是定义 类 的子包,如 Default = A, B 这样 myClass.Setup<Default, C>() 甚至 myClass.Setup<MyClass::Default, C>() 将被解释为 myClass.Setup<A,B,C>().

我知道我可以定义 #define Default A, B 但有没有类似的方法不依赖宏并且可以在 namespace/class 中定义?

感谢阅读,祝您有愉快的一天。 :)

当给定元组或任何特定类型(此处为 tag)时,您可以使用递归:

template <typename...> struct tag{};

class MyClass {
private:
    template <typename T>
    void SetupImpl(tag<T>)
    {
        // Here, individual setup
        DoSomeStuff(new T());
    }
    template <typename ...Ts>
    void SetupImpl(tag<tag<Ts...>>)
    {
        Setup<Ts...>();
    }

public:
    template <typename ... Ts>
    void Setup() {
      (SetupImpl(tag<Ts>{}), ...); // C++17 fold expression
    }
};

using Default = tag<A, B>;

Demo