gpt4 book ai didi

c++ - 模板结构作为数组

转载 作者:行者123 更新时间:2023-11-30 02:23:14 25 4
gpt4 key购买 nike

是否可以使用模板类型字段创建一个结构数组?

template<typename T>
struct MyStruct {
T *pField;
};

MyStruct< ?? > mystruct_arr[] = {
{ pFieldOfType1 },
{ pFieldOfType2 },
};

上述方法显然行不通,但是否可以使用其他技术?

我正在尝试遍历数组 mystruct_arr 并在每个结构行上调用此函数:

template<typename T>
void SetupField(T &pSourceField, ...)
{
Base *field = ...->findBaseFieldFromDatabase(...);
...
pSourceField = static_cast<T>(field);
...
}

原因是要尝试重构一段非常重复的代码,在这段代码中,我必须根据几个不同的参数对一长串不同类型进行 static_cast,而不会使它过于复杂。

最佳答案

模板不是 class , 或 struct .它可以被认为是 class 的蓝图或食谱。或 struct在实例化模板时创建。

模板变成实际的 classstruct仅在实例化时,通过指定所需的模板参数:

MyStruct<int>

现在你有一个真实的、活生生的、会呼吸的class这里。但是一个MyStruct<int>将是一个与 MyStruct<char> 完全不同的类.在不指定模板参数的情况下,MyStruct不是类、结构或任何占用单个字节 RAM 的东西。这只是一些 struct 的模板或 class .

但是有模板参数,比如MySutrct<int> ,这变成了一个带有字段的实际类,也许还有方法。现在你有了一个类,你当然可以有一个这样的数组,现在:

MyStruct<int> mystruct_arr[] = {

};

或者您可以使用不同的 MyStruct<char> 数组小号:

MyStruct<char> mystruct_arr2[] = {

};

但是您不能拥有一个包含这两者的数组,原因与您不能拥有一个包含不同类型和类别的大杂烩的数组的原因相同。您不能拥有同时包含 char 的数组小号,int小号,float s、指针或各种类。数组始终包含相同类型/类的值。所以选择一个特别的 MyStruct<whatever> ,并用它制作一个数组,这就是您所能做的。

但是您现在也可以声明另一个结构:

struct many_structs {
MyStruct<int> int_struct;
MyStruct<char> char_struct;

// ...
};

这种开始看起来像您想要的数组。但它不是一个数组。这只是一个普通的 struct ;您可以直接引用结构成员,而不是使用数组索引来访问特定的模板实例。

通过一些额外的工作,您可以专注于 std::get为你的结构,并使这个结构看起来像一个数组。但现在你才意识到你重新发明了std::tuple ,并且可以简单地做到这一点:

std::tuple<MyStruct<int>, MyStruct<char>> mystruct_tuple;

最后,只有通过一些额外的工作,并且使用支持 C++17 的 C++ 编译器,通过声明一个包含 std::any 的数组,才能最接近您尝试做的事情。 s,或者可能是 std::variant秒。如果数组应仅包含有限的模板实例枚举,std::variant提供最大的类型安全性和便利性:

std::variant<MyStruct<int>, MyStruct<char>> mystruct_arr[]={

};

结果数组只包含这两个特定的模板实例。和 std::any ,螺丝会进一步松开,但您必须做更多工作才能使用和访问数组中的每个值。

关于c++ - 模板结构作为数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46396115/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com