c++templatesc++11variadic-templates

How to make a variadic is_same?


How can I make a class template that returns whether any of its variadic types are equal to the first type. I want to be able to do this:

is_same<T, A, B, C>::value; // true if T is one of A, B or C

And if T is equal to any one of those types, its static value member will be true, otherwise false. How can I do this?


Solution

  • Use template recursion:

    template<typename T, typename... Rest>
    struct is_any : std::false_type {};
    
    template<typename T, typename First>
    struct is_any<T, First> : std::is_same<T, First> {};
    
    template<typename T, typename First, typename... Rest>
    struct is_any<T, First, Rest...>
        : std::integral_constant<bool, std::is_same<T, First>::value || is_any<T, Rest...>::value>
    {};
    
    static_assert(is_any<int, char, double, int>::value, "error 1");   // OK
    static_assert(is_any<int, char, double, short>::value, "error 2"); // error