как проверить, что члены массива 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 ошибку времени компиляции.

4
0
1
Общее количество ответов: 1

Ответ #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
0