此:
constexpr const std::array<int, 3> {{
0,
1
}};
编译好。
但是如何检查(在编译时)整个数组是否被填充?可能有些static_assert
?
答案 0 :(得分:1)
您可以编写一个包装器来为您生成数组并执行检查:
template <typename T, std::size_t N, typename... Ts>
std::array<T, N> make_array (Ts&&... ts) {
static_assert(N == sizeof...(Ts), "Must supply N arguments");
return {{ std::forward<Ts>(ts)... }};
}
但是使用该函数你也可以从参数中推断出数组的大小:
template <typename T, typename... Ts>
std::array<T, sizeof...(Ts)> make_array (Ts&&... ts) {
return {{ std::forward<Ts>(ts)... }};
}
答案 1 :(得分:1)
作为对TartanLlama答案的增强,我会将初始化例程包装到另一个宏中,以提供创建适当文档和更好可读性的可能性(因为op提到这是对其他程序员的安全检查)。
template <typename T, T ...ts>
struct ArrayInitializer {
const std::array<T, sizeof...(ts)> ARRAY = {{ ts... }};
};
/*
* @document me
*/
#define MAKE_ARRAY(name, ...) \
constexpr const auto name = ArrayInitializer<int, ##__VA_ARGS__ >().ARRAY;
// Create array with x elements
MAKE_ARRAY(arrayName, 1, 2, 3, 4);