как проверить, что члены массива const монотонно растут во время компиляции
предположим, что у нас есть массив const:
const int g_Values[] = { ... };
как 9X_cpp проверить монотонный рост членов во время 9X_constexpr компиляции, т.е. g_Values[i] < g_Values[i + 1]
во время выполнения это 9X_constexpr можно проверить так:
bool IsMonotonously() { int i = _countof(g_Values); int m = MAXINT; do { int v = g_Values[--i]; if (v >= m) return false; m = v; } while (i); return true; }
но как переписать это 9X_constexpr-function с помощью constexpr и если IsMonotonously()
вернуть false
- выдаст 9X_constexpr-function ошибку времени компиляции.
Ответ #1
Ответ на вопрос: как проверить, что члены массива const монотонно растут во время компиляции
Это невозможно для массива размером всего 9X_cxx const
. Вам нужно сделать его constexpr
, чтобы иметь возможность 9X_cxx использовать его в контексте constexpr.
Все, что 9X_constexpr-function вам нужно сделать дополнительно к этому, это 9X_cpp реализовать функцию проверки массива в виде 9X_constexpr-function constexpr
:
template constexpr bool IsStrictlyMonotonouslyIncreasing(T (&arr)[N]) { bool result = true; if (N > 1) { for (size_t i = 0; result && (i != N - 1); ++i) { result = (arr[i] < arr[i + 1]); } } return result; } const int g_Values[] = { 1, 2, 3, 4 }; static_assert(IsStrictlyMonotonouslyIncreasing(g_Values)); // compiler error g_Values is not usable in a constexpr context constexpr int g_Values2[] = { 1, 2, 3, 4 }; static_assert(IsStrictlyMonotonouslyIncreasing(g_Values2)); // ok
-
11
-
4
-
4
-
2
-
5
-
5
-
6
-
2
-
4
-
6
-
1
-
3
-
10
-
2
-
2
-
2
-
2
-
4
-
2
-
1
-
1
-
3
-
1
-
2
-
5
-
3
-
2
-
4
-
1
-
1
-
4
-
5
-
3
-
4
-
8
-
3
-
3
-
4
-
5
-
2
-
1
-
3
-
3
-
2
-
2
-
2
-
5
-
1
-
6
-
3