Something like this. First, a small metaprogramming library, because it adds like 2 lines to do it generically:
template<template<typename,typename>class checker, typename... Ts> struct is_any_to_first : std::false_type {}; template<template<typename,typename>class checker, typename T0, typename T1, typename... Ts> struct is_any_to_first<checker, T0, T1, Ts...> : std::integral_constant< bool, checker<T0, T1>::value || is_any_to_first<checker, T0, Ts...>::value> {};
Then a 2 line implementation of is_any_same_to_first:
template<typename... Ts> using is_any_same_to_first = is_any_to_first< std::is_same, Ts... >;
And for completeness, the original is_all, which may also prove useful:
template<template<typename,typename>class checker, typename... Ts> struct is_all : std::true_type {}; template<template<typename,typename>class checker, typename T0, typename T1, typename... Ts> struct is_all<checker, T0, T1, Ts...> : std::integral_constant< bool, checker<T0, T1>::value && is_all<checker, T0, Ts...>::value> {}; template<typename... Ts> using is_all_same = is_all< std::is_same, Ts... >;
Live example of the is_all_same.
Note that calling is_any_same_to_first anything less explicit is asking for trouble. 2/3 people who tried to answer this question, including me, assumed that is_same<A,B,C> is true iff all three are the same type!