C++:创建模板结构的 C++ 向量

Posted

技术标签:

【中文标题】C++:创建模板结构的 C++ 向量【英文标题】:C++: Creating a C++ vector of a template struct 【发布时间】:2021-01-11 15:47:22 【问题描述】:

我有以下结构:

template <typename A, typename B>
struct Name 

;

我正在尝试创建一个名称类型的向量,例如 std::vector&lt;Name&gt;

在其余代码中,结构的初始化方式是我不知道 A 和 B 的类型,但我希望它们始终相同。

我尝试获取A和B的类型如下:

#include <cxxabi.h>
int status;
std::string tname = typeid(class_object).name(); // class_object is a Name object
std::cerr << abi::__cxa_demangle(tname.c_str(), NULL, NULL, &status) << std::endl;

并获得Name&lt;void (*)(), void (*)()&gt;

然后我尝试将向量创建为std::vector&lt;Name&lt;void (*)(), void (*)()&gt;&gt; nameVec;,但出现no matching function for call to 错误。

我使用了以下link 但没有成功可能是因为我不确定我的例子中的结构是如何初始化的。

感谢您的帮助!

【问题讨论】:

我们可以得到minimal reproducible example吗? 请展示一个完整的例子——不清楚“其余代码”是什么意思。 您不能创建类模板向量。您需要多态性并将基类指针存储在向量中。您可以使用std::any 的向量或std::variant&lt;...&gt; 实例的向量。 注意Name 不是类型!它只有在使用模板参数实例化时才成为一种类型。 (您可以在问题中更清楚地描述您遇到的问题,因此所有这些 cmets 都不是必需的) 【参考方案1】:

Name 不是类型,它是模板。 Name&lt;int, int&gt; 是一种类型,不同于 Name&lt;std::string, std::string&gt;

您可以为给定的对象类型创建别名。

using class_object_t = decltype(class_object);

std::vector<class_object_t> vec;
vec.push_back(class_object);

如果你想找出ABName 的实例化的什么,并且不能更改Name,你可以创建一个特征。

template <typename>
struct Name_trait;

template <typename A, typename B>
struct Name_trait<Name<A, B>> 
    using first_type = A;
    using second_type = B;
;

template <typename N>
using Name_first_t = typename Name_trait<N>::first_type;

template <typename N>
using Name_second_t = typename Name_trait<N>::second_type;

Name<int, char> n;
static_assert(std::is_same_v<int, Name_first_t<decltype(n)>>);    
static_assert(std::is_same_v<char, Name_second_t<decltype(n)>>);

【讨论】:

以上是关于C++:创建模板结构的 C++ 向量的主要内容,如果未能解决你的问题,请参考以下文章

C++:实现向量和矩阵类的最佳结构

c++ 以最佳方式返回结构和向量

C++ 结构/向量编译问题

小白学习C++ 教程五C++数据结构向量和数组

Swig - 结构的 C++ 向量以及如何连接它们

C++ - 3-d 数据结构 - 我应该使用指针向量还是向量向量?