Как передать массив constexpr в функцию - PullRequest
0 голосов
/ 07 мая 2019

Мне нужно выполнить проверку массива constexpr, но я не могу понять, как передать массив в функцию проверки.

#include <cstdlib>

constexpr int is[2] = {23, 42};

void inline check(const int (&elems)[2])
{
    static_assert(elems[0] == 23, "Does not work");
}


void bar()
{
    static_assert (is[0] == 23, "Works");
    check(is);
}

Есть ли способ передать массив в проверкуфункция без потери свойства constexpr?

1 Ответ

3 голосов
/ 07 мая 2019

static_assert внутри check зависит от параметра функции.Это не означает, что у вас есть аргумент constexpr для этой функции.Обратите внимание, что функция обычно используется несколько раз.Таким образом, в одном случае static_assert может произойти сбой, в другом может пройтиСтатическое утверждение не проверяет, откуда была вызвана функция, содержащая его.Это должно быть проверено во время компиляции без проверки того, что ниже.

Возможно, вам нужно что-то вроде этого:

constexpr int is[2] = {23, 42};

template<typename T>
constexpr bool firstElementIs23(const T& v)
{
    return v[0] == 23;
}

void bar()
{
    static_assert (firstElementIs23(is), "Works");
}

Живой образец

...