类似的东西。首先,一个小的元编程库,因为它添加了大约 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... >;
Live example 中的is_all_same。
请注意,调用is_any_same_to_first 任何不太明确的内容都是自找麻烦。 2/3 试图回答这个问题的人,包括我在内,都认为is_same<A,B,C> 是真的,只要这三个都是同一类型!