我试图得到一个const int数组的总和作为constexpr,以便我可以使用sum作为另一个数组的大小
constexpr int arr[] = {1,2,3}; constexpr int sum1 = std::accumulate(arr,arr + 3,0); // not OK int arr1[sum1];
上面没有编译,因为std :: accumulate()没有返回constexpr.我最终得到了这样的解决方法
template <size_t N> constexpr int sum(int const a[]) { return a[N-1] + sum<N - 1>(a); } template <> constexpr int sum<0>(int const a[]) { return 0; } constexpr int arr[] = {1,3}; constexpr int sum1 = sum<3>(arr); int arr1[sum1];
有没有更简单的解决方案?
解决方法
从C 14的轻松constexpr你可以做这样的事情:
#include <iostream> constexpr int arr[] = {1,3}; template <size_t Size> constexpr int sum(const int (&arr)[Size]) { int ret = 0; for (int i = 0; i < Size; ++i) ret += arr[i]; return ret; } int main() { int arr1[sum(arr)]; std::cout << sizeof(arr1) / sizeof(int); }