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<Name>
。
在其余代码中,结构的初始化方式是我不知道 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<void (*)(), void (*)()>
。
然后我尝试将向量创建为std::vector<Name<void (*)(), void (*)()>> nameVec;
,但出现no matching function for call to
错误。
我使用了以下link 但没有成功可能是因为我不确定我的例子中的结构是如何初始化的。
感谢您的帮助!
【问题讨论】:
我们可以得到minimal reproducible example吗? 请展示一个完整的例子——不清楚“其余代码”是什么意思。 您不能创建类模板向量。您需要多态性并将基类指针存储在向量中。您可以使用std::any
的向量或std::variant<...>
实例的向量。
注意Name
不是类型!它只有在使用模板参数实例化时才成为一种类型。
(您可以在问题中更清楚地描述您遇到的问题,因此所有这些 cmets 都不是必需的)
【参考方案1】:
Name
不是类型,它是模板。 Name<int, int>
是一种类型,不同于 Name<std::string, std::string>
。
您可以为给定的对象类型创建别名。
using class_object_t = decltype(class_object);
std::vector<class_object_t> vec;
vec.push_back(class_object);
如果你想找出A
和B
是Name
的实例化的什么,并且不能更改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++ 向量的主要内容,如果未能解决你的问题,请参考以下文章