编译时检查是否填充了所有数组值

时间:2016-10-06 08:39:48

标签: c++ compile-time static-assert

此:

constexpr const std::array<int, 3> {{
  0,
  1
}};

编译好。

但是如何检查(在编译时)整个数组是否被填充?可能有些static_assert

2 个答案:

答案 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);