Обработка фатальных ошибок (или утверждений) в функциях constexpr - PullRequest
0 голосов
/ 25 февраля 2019

Что мне делать в следующей функции, если тип аргумента T неверен?

    template <class T>
    constexpr inline size_t GetObjectSize(const T & val)
    {
        if constexpr (std::is_arithmetic<T>::value)
        {
            return sizeof(val);
        }

        if constexpr (std::is_class<T>)
        {
            return 5u;
        }

        //there should be compile time error.
    }

    int * p;
    //compile time error
    GetObjectSize(p);

Возможны следующие варианты: 1) создание исключения 2) assert 3) static_assert

1) Исключение какого типа я должен выбросить?

2) это определено реализацией и не гарантируется быть costexpr.

3) static_assert (false) всегда терпит неудачу независимоТ.

1 Ответ

0 голосов
/ 25 февраля 2019

static_assert (false) всегда терпит неудачу независимо от T.

Затем установите его в зависимости от T.

template<typename>
struct always_false { enum {value = 0}; };

// ...

if constexpr(...) {
}
else {
    static_assert(always_false<T>::value, "Some useful description");
}

Да, это фокус мага.Но сухая буква закона в порядке.К сожалению, в действительности нет лучшего способа напечатать полезную диагностику в зависимой ветви if constexpr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...