编译时检查所有数组值是否已填充
Compile-time check that all array values are filled
这个:
constexpr const std::array<int, 3> {{
0,
1
}};
编译成功。
但是如何检查(在编译时)整个数组是否已填满?可能是一些 static_assert
?
您可以编写一个包装器来为您生成数组并执行检查:
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)... }};
}
作为对 TartanLlama 答案的增强,我会将初始化例程包装到另一个宏中,以提供创建适当文档和更好可读性的可能性(因为操作提到这是对其他程序员的安全检查)。
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);
这个:
constexpr const std::array<int, 3> {{
0,
1
}};
编译成功。
但是如何检查(在编译时)整个数组是否已填满?可能是一些 static_assert
?
您可以编写一个包装器来为您生成数组并执行检查:
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)... }};
}
作为对 TartanLlama 答案的增强,我会将初始化例程包装到另一个宏中,以提供创建适当文档和更好可读性的可能性(因为操作提到这是对其他程序员的安全检查)。
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);