Qualcosa di simile. In primo luogo, una piccola biblioteca metaprogrammazione, perché aggiunge come 2 linee di farlo genericamente:
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>
{};
Poi un'implementazione 2 linea di is_any_same_to_first
:
template<typename... Ts>
using is_any_same_to_first = is_any_to_first< std::is_same, Ts... >;
E per completezza, l'originale is_all
, che può anche rivelarsi utile:
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 del is_all_same
.
Nota che chiamare il numero is_any_same_to_first
in modo meno esplicito è un problema. 2/3 persone che hanno provato a rispondere a questa domanda, incluso me, hanno supposto che is_same<A,B,C>
sia vero se tutte e tre sono dello stesso tipo!
Dal momento che il vostro intento non era chiaro (due persone hanno fatto la stessa interpretazione sbagliata) Mi sono permesso di riformulare leggermente la tua domanda. – syam