Что-то вроде этого. Во-первых, небольшая библиотека метапрограммирования, потому что она добавляет примерно 2 строки, чтобы сделать это в общем:
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>
{};
Затем двухстрочная реализация is_any_same_to_first
:
template<typename... Ts>
using is_any_same_to_first = is_any_to_first< std::is_same, Ts... >;
И для полноты оригинальное is_all
, которое тоже может оказаться полезным:
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... >;
Живой пример is_all_same
.
Обратите внимание, что вызов is_any_same_to_first
чего-либо менее явного вызывает проблемы. 2/3 человек, которые пытались ответить на этот вопрос, включая меня, предположили, что is_same<A,B,C>
истинно, если все три типа одного и того же типа!
person
Yakk - Adam Nevraumont
schedule
10.06.2013