在单元测试中,我想要一种快速(干净的)肮脏的方式从initializer_list
向静态大小的C数组分配值。我不是一个完整的野兽,所以我想static_assert
大小相同。我写了一个辅助函数set_array
来做到这一点:
template <typename T,std::size_t N>
constexpr void set_array(T (&x)[N],std::initializer_list<T>&& list) {
assert(list.size() == N); // why can't I static_assert in C++17?
for (std::size_t i = 0; i < N; ++i)
x[i] = list.begin()[i];
}
旨在将其用作set_array(foo,{1,2,3,4});
,并将foo声明为int foo[4]
。
我使用的是C ++ 17,所以std std::initializer_list<T>::size
是constexpr,但是一旦通过函数调用传递列表,我便失去了将其视为constexpr的特权,因为我无法约束函数参数为constexpr。
感觉应该有一个我没有看到的简单解决方案。当然,我可以想象一些反常的元编程游戏,我可以玩这些游戏来将大小编码为一种类型,但这是一个简单的小帮手,应该可以使事情变得清晰易读,而且我也不想胡闹。
问题:是否有一个简单的解决方案,还是我应该只接受运行时断言? (是的,我知道,如果给我一个简单的解决方案,我会因为自己没看过而感到愚蠢。)认为我会以错误的方式处理吗?很好,我愿意接受建议,也欢迎提出批评。
详细信息: 为了完整起见,这是编译器错误和版本信息。在Clang版本8.0.0-3(Ubuntu clang-8随附)中,我得到:
error: static_assert expression is not an
integral constant expression
static_assert(list.size() == N);
^~~~~~~~~~~~~~~~
在GCC 8.3.0中,我遇到了类似的错误,另外还告诉我list
不是常量表达式。