C++: проверьте, является ли тип шаблона одним из типов шаблонов с переменным значением
Допустим, у нас есть функция:
template <typename Kind, typename... Kinds> void foo(){...};
Какой самый простой способ проверить, является ли тип "Вид" одним из типов "Виды" в C++ (включая C++1z)?
1 ответ
Вы можете использовать следующую черту типа:
template <typename...>
struct is_one_of {
static constexpr bool value = false;
};
template <typename F, typename S, typename... T>
struct is_one_of<F, S, T...> {
static constexpr bool value =
std::is_same<F, S>::value || is_one_of<F, T...>::value;
};
Обновление C++17
При использовании расширения шаблона C++17 больше не требуется вспомогательный класс
template <typename Kind, typename... Kinds> void foo(){
/* The following expands to :
* std::is_same_v<Kind, Kind0> || std::is_same_v<Kind, Kind1> || ... */
if constexpr ((std::is_same_v<Kind, Kinds> || ...)) {
// expected type
} else {
// not expected type
}
};