如何使用“constexpr”兼容实例化创建这种类型的 C++ 模板数组集合类

How to create this type of C++ template array collection class with `constexpr` Compatible Instantiation

提问人:Bondrewd 提问时间:11/1/2023 更新时间:11/1/2023 访问量:101

问:

我想知道是否可以在 C++ 项目上创建一个模板类,该类允许实例化具有可变大小的数组,类似于以下示例:

ArraysCollection<int, 3, 6, 8, 2> myArrays;

在此示例中,应包含不同大小的数组,用户可以在模板参数中输入他们想要的任意大小。我还想确保该类是兼容的。该类的结果数据成员应如下所示:myArraysconstexpr

SomeType arraysCollectionData[] = {
    {0, 0, 0},
    {0, 0, 0, 0, 0, 0},
    {0, 0, 0, 0, 0, 0, 0, 0},
    {0, 0}
}

另一个例子:

ArrayCollection<float, 2, 3> floatArrays {
    {-10.f}, {2.f, 3.14f}
};

// results to
SomeType arraysCollectionData[] = {
    {-10.f, 0.f}, {2.f, 3.14f, 0.f}
}

我不太确定如何实现这一目标。任何人都可以提供有关如何在 C++ 中实现这种兼容并允许以指定方式实例化的模板类的指导或示例吗?constexpr

任何帮助或建议将不胜感激。提前致谢!

C++ 模板 实例化 constexpr

评论

0赞 StoryTeller - Unslander Monica 11/1/2023
传统 C 阵列从不具有可变大小。即使每行提供不同数量的初始值设定项,它们也都具有相同的长度,未提及的初始值设定项默认初始化。
0赞 Bondrewd 11/1/2023
@StoryTeller-UnslanderMonica 生成的数据可以是任何东西,一个向量、一个数组、一个列表(但我不喜欢这样)或任何不仅限于 C 数组的东西。
1赞 StoryTeller - Unslander Monica 11/1/2023
那么为什么要指定尺寸呢?不适用于您心目中的初始值设定项?std::vector<std::vector<T>>
0赞 user12002570 11/1/2023
@Bondrewd “生成的数据可以是任何东西,一个向量......” 请注意,它不能在编译时初始化。
0赞 StoryTeller - Unslander Monica 11/1/2023
还有

答:

4赞 StoryTeller - Unslander Monica 11/1/2023 #1

你可以用数组元组的别名来获得,假设你没有其他未指定的要求。

#include <tuple>
#include <array>

template<typename T, unsigned ...Sizes>
using ArraysCollection = std::tuple<std::array<T, Sizes>...>;

constexpr ArraysCollection<float, 2, 3> floatArrays {
    {-10.f}, {2.f, 3.14f}
};

这两种类型在最新的 C++ 标准中都是 constexpr 友好的,因此您可以将它们用于常量初始化对象。

评论

1赞 Quimby 11/1/2023
吹毛求疵:第二个参数是 ,不是 。std::arraystd::size_tunsigned
1赞 StoryTeller - Unslander Monica 11/1/2023
@Quimby - 不太可能不会转换为 .因此,为了简化演示,我将保持参数的原样。unsignedstd::size_tArraysCollection
0赞 Ted Lyngmo 11/1/2023
如果想要扩展 的功能,另一种选择是继承:ArraysCollectiontemplate <class T, T... Ss> struct ArraysCollection : public std::array<T, Ss>... {};
0赞 StoryTeller - Unslander Monica 11/1/2023
@TedLyngmo - 这并不那么简单。即使你不介意自己编写一堆机器进行迭代,你也不能在这个方案中重复大小,因为那样你就会直接从同一个基类继承不止一次,这是格式不正确的。你的意思是从元组继承吗?
0赞 Ted Lyngmo 11/1/2023
@StoryTeller-Unslander莫妮卡:啊,是的,就是这样。也许是这样的东西。