Ошибка компиляции, если условие constexpr не выполняется

Я хочу сопоставить определенные типы данных с помощью шаблонной функции C++, и если ни один из случаев constexpr не соответствует, я хочу вызвать ошибку компиляции:

template<typename ValueType>
void match_data_type() {
    if constexpr (std::is_same_v<ValueType, bool>) {
        std::cout << "bool" << std::endl;
    } else if constexpr (std::is_same_v<ValueType, const char *>) {
        std::cout << "const char *" << std::endl;
    } else if constexpr (std::is_same_v<ValueType, std::string>) {
        std::cout << "std::string" << std::endl;
    } else {
        std::cout << "Not matched!" << std::endl;
        // static_assert(false, "Unhandled data type");
    }
}

Пример использования:

match_data_type<bool>();
match_data_type<char *>();
match_data_type<std::string>();
match_data_type<std::stringstream>();

Выход:

bool
const char *
std::string
Not matched!

Возможно ли, что несовпадающие типы данных вызывают ошибку компиляции, и если да, то как это можно реализовать? static_assert не работает, поскольку действует всегда, независимо от того, где находится в коде (например, раскомментирование строки выше всегда будет вызывать ошибку утверждения независимо от контекста). Обратите внимание, что я не хочу генерировать исключение, а вообще не хочу передавать необработанный тип данных в match_data_type().


person BullyWiiPlaza    schedule 18.11.2020    source источник