Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有办法将具有不同模板参数的模板类实例放到一个向量中?_C++_Templates - Fatal编程技术网

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
从不分配额外的内存。