【发布时间】:2021-10-27 11:37:33
【问题描述】:
假设我有两个结构
struct A
{ int x;
int y;
};
struct B
{ int count;
const A* list;
};
现在我要初始化一个编译时间常数Bs。
static const B Barray[] =
{ { 2,
{ { 7,8 }, {9,10} } // error
},
{ 1,
{ { 30,40 } } // error
},
};
后者(当然)不起作用,因为list 未声明为数组。但这是(旧)API 经常声明的方式。
我可以使用一个基本上只是演员表的辅助函数:
template<typename T>
constexpr static const T* make_pointer(const T (&array)[])
{
return array;
}
static const B Barray[] =
{ { 2,
make_pointer<A>({ { 7,8 }, {9,10} })
},
{ 1,
make_pointer<A>({ { 30,40 } })
}
};
但这不是那么漂亮。 是否可以在没有辅助函数的情况下直接初始化数据结构? (当然,每个 A[] 都没有命名静态常量。)
【问题讨论】:
-
您需要在编译时使用它吗?如果没有,
const std::vector<A>会为您工作。它让你有一个运行时确定的大小,但你不能在构造后改变那个大小,你只能改变向量中的元素。如果你不想这样,你甚至可以使用const vector<const A>。 -
vector<>不会有任何帮助,因为它还需要一些绑定到的静态存储。否则只是暂时的。所以vector对每个数组的命名静态常量没有任何优势。
标签: c++ arrays initialization