提问人:Bondrewd 提问时间:11/1/2023 更新时间:11/1/2023 访问量:101
如何使用“constexpr”兼容实例化创建这种类型的 C++ 模板数组集合类
How to create this type of C++ template array collection class with `constexpr` Compatible Instantiation
问:
我想知道是否可以在 C++ 项目上创建一个模板类,该类允许实例化具有可变大小的数组,类似于以下示例:
ArraysCollection<int, 3, 6, 8, 2> myArrays;
在此示例中,应包含不同大小的数组,用户可以在模板参数中输入他们想要的任意大小。我还想确保该类是兼容的。该类的结果数据成员应如下所示:myArrays
constexpr
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
任何帮助或建议将不胜感激。提前致谢!
答:
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::array
std::size_t
unsigned
1赞
StoryTeller - Unslander Monica
11/1/2023
@Quimby - 不太可能不会转换为 .因此,为了简化演示,我将保持参数的原样。unsigned
std::size_t
ArraysCollection
0赞
Ted Lyngmo
11/1/2023
如果想要扩展 的功能,另一种选择是继承:ArraysCollection
template <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莫妮卡:啊,是的,就是这样。也许是这样的东西。
评论
std::vector<std::vector<T>>