使用不带循环的非零值初始化C样式数组 我们知道C++允许:
这同样适用于std::array使用不带循环的非零值初始化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 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