初始化特定类型的 std::array,但任意大小?

问题描述 投票:0回答:1

假设我有以下代码:

using Element = std::array<int, 2>;

constexpr auto arrayOfElement()
{
    return std::array
    {
        Element{ 1, 2 },
        Element{ 2, 3 },
        Element{ 123, 123 },
        Element{ 8008, 1337 }
    };
}

这编译得很好,但为了指示我作为返回数组元素的类型,我必须不断重复

Element
类型名称。另一种写法:

constexpr auto arrayOfElement2()
{
    return std::array<Element, 4>
    {
        Element{ 1, 2 },
        { 2, 3 },
        { 123, 123 },
        { 8008, 1337 }
    };
}

在这里,我不必输入

Element
次数与元素数量一样多,但在这种情况下,我无法推导出大小,并且必须输入第一个元素,这使得整个事情看起来有点尴尬第一个元素有一个边缘情况。

有没有一种方法可以让我只指定一次

Element
类型,同时还能推导出数组的大小(部分 CTAD)?

c++ arrays initialization aggregate-initialization ctad
1个回答
8
投票

由于如果不指定元素数量就无法指定元素类型,因此请使用

std::to_array
:

constexpr auto arrayOfElement() {
    return std::to_array<Element>({
        { 1, 2 },
        { 2, 3 },
        { 123, 123 },
        { 8008, 1337 }
    });
}

摘自 cppreference wiki 页面上的注释:

在某些情况下,当

std::array
可用时,无法使用
to_array
的类模板参数推导:

    当手动指定
  • to_array
    的元素类型并推导长度时,可以使用
    std::array
    ,当需要隐式转换时,这是更好的选择。
  • to_array
    可以复制字符串文字,而类模板参数推导则构造一个指向其第一个字符的单个指针的
    std::array
© www.soinside.com 2019 - 2024. All rights reserved.