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;
};

Live Demo

Обновление 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
    }
};

Live Demo

Другие вопросы по тегам