拆分可变参数模板参数以用作其他 类 的单个模板参数
Split variadic template params up to use as single template parameters for other classes
我正在尝试弄清楚如何为 class 提供任意模板参数,然后让 class 使用这些参数中的每一个来实例化低音 class。沿着这些线的东西:
template<class T>
SingleParamClass;
template<class ... TYPE_LIST>
MultiParamClass : SingleParamClass<TYPE_LIST[0]>, SingleParamClass<TYPE_LIST[1]>... SingleParamClass<TYPE_LIST[N]>;
为了演示目的,我已经在参数包中编写了索引。
我知道如何解压类型列表,但不知道如何以我可以使用它的方式解压它。
编辑:
根据要求,我将扩展我正在尝试做的事情...
我想创建一个子class,它使用可变参数模板参数中的类型构造一系列纯虚方法。这些纯虚方法供另一个组件调用,同时强制开发人员在派生的 class.
中实现这些方法
在 C++ 以我想要的方式神奇地工作的世界里,我会做这样的事情:
template<class ... TYPE_LIST>
MultiParamClass {
virtual void func(TYPE_LIST[0] arg) = 0;
virtual void func(TYPE_LIST[1] arg) = 0;
...
virtual void func(TYPE_LIST[N] arg) = 0;
}
我不知道如何做到这一点,所以我正在尝试使用 subclasses 找到绕过它的方法,如下所示:
template<class T>
SingleParamClass {
virtual void func(T arg) = 0;
}
template<class ... TYPE_LIST>
MultiParamClass : SingleParamClass<TYPE_LIST[0]>, SingleParamClass<TYPE_LIST[1]>... SingleParamClass<TYPE_LIST[N]>;
您可以像这样扩展参数包:
template<class T>
struct SingleParamClass {};
template<class ... TYPE_LIST>
struct MultiParamClass : SingleParamClass<TYPE_LIST>... {};
也许试试这样的方法:
template<class T>
class SingleParamClass
{
public:
virtual void func(T arg) = 0;
};
template<class... TYPE_LIST>
class MultiParamClass : public SingleParamClass<TYPE_LIST>...
{
};
class MyMultiParamClass : public MultiParamClass<int, double, string>
{
public:
void func(int arg) override { ... }
void func(double arg) override { ... }
void func(string arg) override { ... }
};
我正在尝试弄清楚如何为 class 提供任意模板参数,然后让 class 使用这些参数中的每一个来实例化低音 class。沿着这些线的东西:
template<class T>
SingleParamClass;
template<class ... TYPE_LIST>
MultiParamClass : SingleParamClass<TYPE_LIST[0]>, SingleParamClass<TYPE_LIST[1]>... SingleParamClass<TYPE_LIST[N]>;
为了演示目的,我已经在参数包中编写了索引。
我知道如何解压类型列表,但不知道如何以我可以使用它的方式解压它。
编辑:
根据要求,我将扩展我正在尝试做的事情...
我想创建一个子class,它使用可变参数模板参数中的类型构造一系列纯虚方法。这些纯虚方法供另一个组件调用,同时强制开发人员在派生的 class.
中实现这些方法在 C++ 以我想要的方式神奇地工作的世界里,我会做这样的事情:
template<class ... TYPE_LIST>
MultiParamClass {
virtual void func(TYPE_LIST[0] arg) = 0;
virtual void func(TYPE_LIST[1] arg) = 0;
...
virtual void func(TYPE_LIST[N] arg) = 0;
}
我不知道如何做到这一点,所以我正在尝试使用 subclasses 找到绕过它的方法,如下所示:
template<class T>
SingleParamClass {
virtual void func(T arg) = 0;
}
template<class ... TYPE_LIST>
MultiParamClass : SingleParamClass<TYPE_LIST[0]>, SingleParamClass<TYPE_LIST[1]>... SingleParamClass<TYPE_LIST[N]>;
您可以像这样扩展参数包:
template<class T>
struct SingleParamClass {};
template<class ... TYPE_LIST>
struct MultiParamClass : SingleParamClass<TYPE_LIST>... {};
也许试试这样的方法:
template<class T>
class SingleParamClass
{
public:
virtual void func(T arg) = 0;
};
template<class... TYPE_LIST>
class MultiParamClass : public SingleParamClass<TYPE_LIST>...
{
};
class MyMultiParamClass : public MultiParamClass<int, double, string>
{
public:
void func(int arg) override { ... }
void func(double arg) override { ... }
void func(string arg) override { ... }
};