在 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>;
我有类似的基于可变参数模板的东西:
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>;