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