使用不带循环的非零值初始化C样式数组 我们知道C++允许:

使用不带循环的非零值初始化C样式数组 我们知道C++允许:,c++,arrays,C++,Arrays,这同样适用于std::array std::array a<int, 5> = {}; 但是我不确定它是否对其他编译器有效。我有一些代码,可以使用模板元编程(当然)实现std::array的编译时初始化 namespace impl{ 模板 结构使填充{ 使用type=typename make_fill::type; }; 模板 结构使填充{ 使用type=std::integer\u序列; }; 模板 构造数组; 模板 结构生成数组{ 静态constexpr std::数组值(

这同样适用于std::array

std::array a<int, 5> = {};

但是我不确定它是否对其他编译器有效。

我有一些代码,可以使用模板元编程(当然)实现
std::array
的编译时初始化

namespace impl{
模板
结构使填充{
使用type=typename make_fill::type;
};
模板
结构使填充{
使用type=std::integer\u序列;
};
模板
构造数组;
模板
结构生成数组{
静态constexpr std::数组值(){
返回std::数组{{Seq…}};
}
};
}//结束impl名称空间
模板
constexpr std::数组填充(){
返回impl::make_数组::value();
};
您可以按如下方式使用:

std::array<size_t, N> ones = fill<size_t,N,1ul>();
std::array one=fill();

我认为,如果您不想使用
std::array

的话,您可以很容易地调整它,您有什么反对
?我觉得这很干净:

int a[5];                                  // not initialized here yet
std::fill(std::begin(a), std::end(a), 33); // everything initialized to 33

也许您需要收紧需求,因为
inta[5]={33,33,33,33}谷歌搜索你的确切标题会给出:“大约1470000个结果”。也许其中有些东西可能有用。@LightnessRacesinOrbit我个人更喜欢这样的限定词,它让我的讨论更清楚。@LightnessRacesinOrbit的人,甚至程序员,很少用英语说或键入名称空间。讨论向量和映射和集合是非常普遍的,即使在C++中,这些东西只存在于<代码> STD< /COD>命名空间中。人们也会讨论数组,根据上下文的不同,他们可能会提到数组的任何一种形式,甚至是一个向量,它也是一个对象数组。因此,需要一种方法来消除这个术语的歧义。从C到C风格的变化不是个人的,它更多的是一个理论问题。我们有一种适用于零的语法,有没有类似的语法适用于非零;这里应用了相同的初始化规则。你的答案和我想要的差不多。
int a[5] = {[0..4] = 33};
namespace impl {

    template <class SeqTy, size_t N, SeqTy FillVal, SeqTy... Seq>
    struct make_fill {
        using type = typename make_fill<SeqTy, N-1, FillVal, FillVal, Seq...>::type;
    };

    template <class SeqTy, SeqTy FillVal, SeqTy... Seq>
    struct make_fill<SeqTy, 0, FillVal, Seq...> {
        using type = std::integer_sequence<SeqTy, Seq...>;
    };

    template <class T>
    struct make_array;

    template <class SeqTy, SeqTy... Seq>
    struct make_array<std::integer_sequence<SeqTy, Seq...>> {
        static constexpr std::array<SeqTy, sizeof...(Seq)> value() { 
            return std::array<SeqTy, sizeof...(Seq)>{ {Seq...} };
        }
    };

} // end impl namespace

template <class SeqTy, size_t N, SeqTy FillVal = 0ul>
constexpr std::array<SeqTy, N> fill() {
    return impl::make_array<typename impl::make_fill<SeqTy, N, FillVal>::type>::value();
};
std::array<size_t, N> ones = fill<size_t,N,1ul>();
int a[5];                                  // not initialized here yet
std::fill(std::begin(a), std::end(a), 33); // everything initialized to 33