Я хочу сопоставить определенные типы данных с помощью шаблонной функции 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()
.