Каков наилучший способ подражать воображаемому constexpr_assert в C ++ 17? - PullRequest
0 голосов
/ 04 ноября 2018

Я только что посмотрел cppcon talk , где автор замороженной библиотеки объясняет, как он использует assert в функциях constexpr и работает (потому что во время выполнения он работает так, как должен, а во время компиляции запускает выполнение без constexpr) функции, чтобы произошла ошибка компилятора).

Проблема в том, что вы не можете дать пользователю значительную текстовую ошибку, как в случае static_assert, и компиляция завершается неудачно в реализации макроса assert.

Также вы не можете использовать static_assert для аргументов функции, поскольку они не являются constexpr, и я не хочу перемещать аргументы функции внутри <>, чтобы сделать их constexpr. Вот пример преобразования, которого я хочу избежать:

constexpr unsigned int safe_right_shift(const unsigned int val, const unsigned shift){
    assert(shift<sizeof(unsigned int)*CHAR_BIT); //ugly error
    return val >>shift;
}

template<unsigned int shift>
constexpr unsigned int safe_right_shift_t(const unsigned int val){
    static_assert(shift<sizeof(unsigned int)*CHAR_BIT);
    return val >>shift;
}

Есть ли лучший способ в C ++ 17 сделать то, что сделал бы гипотетический constexpr_assert?

Я определяю constexpr_assert как утверждение, которое проверяет значения только во время вычисления constexpr (он же время компиляции).

P.S. Ошибка:

примечание: функция non-constexpr '__assert_fail' не может использоваться в константном выражении

полный код

...