C++ 有没有办法将具有不同模板参数的模板类实例放到一个向量中?
我从我的同事那里得到了一个模板类,假设它是:C++ 有没有办法将具有不同模板参数的模板类实例放到一个向量中?,c++,templates,C++,Templates,我从我的同事那里得到了一个模板类,假设它是: template<int p1> class Foo { public: Foo() : i(p1) {} private: int i; }; 模板 福班{ 公众: Foo():i(p1){} 私人: int i; }; (这是一个例子,真实的类更复杂,但这个例子足以说明我的问题。) 我不知道他是否这样做,而不是故意使用构造函数参数,但现在我想在向量中放置一些foo: std::vector<Foo<1>
template<int p1>
class Foo {
public:
Foo() : i(p1) {}
private:
int i;
};
模板
福班{
公众:
Foo():i(p1){}
私人:
int i;
};
(这是一个例子,真实的类更复杂,但这个例子足以说明我的问题。)
我不知道他是否这样做,而不是故意使用构造函数参数,但现在我想在向量中放置一些foo:
std::vector<Foo<1>> v;
v.push_back(Foo<1>());
v.push_back(Foo<2>());
std::vector v;
v、 向后推(Foo());
v、 向后推(Foo());
这段代码当然不会被编译,因为Foo
和Foo
是两种不同的类型。但事实上,这两种类型具有相同的内存布局,所以有没有办法通过向量来管理这样的类型
编辑:我发现他使用p1
进行了一些编译时检查,尽管讨论了设计,但这并不是毫无用处的,同时关注这个问题
但事实上,这两种类型具有相同的内存布局,所以有没有办法通过向量来管理这样的类型
无需任何修改即可直接将数据存储到向量中
您可以使用std::vector>
,但这将为每个元素添加一个标记变量,从而增加所需的内存资源
但总的来说:模板真的毫无意义!如果模板类型具有非类型模板参数,则可以在编译时访问此参数。无需将该值再次存储为运行时变量
请记住:每个模板实例将生成代码,这在您的示例中目前没有帮助,因此您的程序大小将增加,但没有任何好处。而且它没有保存任何ram资源,因为它将参数复制到运行时实例中
你绝对应该考虑你的设计!选择您需要的:运行时或编译时!如示例中所示,将其混合只会浪费资源。Foo
和Foo
是完全不相关的类型,因此不能直接存储在同一个向量中
根据您的用例,有多种选择
最简单的方法是向Foo
添加一个非模板基类,然后您可以创建一个指向基类的指针向量(最好是智能指针),然后您可以向该基类添加任何Foo
对象
另一种选择是使用std::variant
,但是您需要事先声明您要使用的每个模板,如果它是多个或任意数,这可能会变得很麻烦
第三个选项是std::any
,这将允许您将任何内容放入向量中。在使用之前,您必须检查每个元素的类型
显然,在您的简单示例中,最好的解决方案是从
Foo
中删除模板参数,因为它没有任何用途。为什么Foo
必须是模板类型?参数p1
用于初始化成员i
。将Foo
更改为一个非模板类,并提供一个接受int
的构造函数,允许所有实例都是相同的类型-因此它们可以存储在一个向量中,而无需唱歌跳舞-根据需要使用不同的值。另请注意,如果类共享相同的基本布局,但具有不同的接口,像那样组织他们。如果接口与容器无关,则使用包含所有数据的基类或组件类(实例作为成员存储在其中)。只存储数据承载组件,有一种结构方式将它们转换为接口。std::any
是否有任何开销?是的,它类似于std::variant
,它存储一个对象加上一个标记来说明它包含的类型。我认为std::variant
可能比std::any
更快。例如,请参见@ravenisadesk,std::any
允许在堆上分配内存来存储对象,如果对象太大而无法存储在std::any
本身中。相反,std::variant
从不分配额外的内存。