C ++:检查模板类型是否是可变参数模板类型之一

时间:2015-12-05 21:22:21

标签: c++ c++11 c++14 variadic-templates c++17

我们说我们有功能:

var objects: AudioSource = SingletonMusic.object.GetComponent(AudioSource); 
if( objects.isPlaying ) 
objects.Pause(); 
else 
objects.Play();

检查类型'种类'的最简单方法是什么?是其中一种类型'种类'在C ++中(包括C ++ 1z)?

1 个答案:

答案 0 :(得分:9)

您可以使用以下类型特征:

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

classification

更新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