Điều gì đó tương tự. Đầu tiên, một thư viện lập trình meta nhỏ, bởi vì nó cho biết thêm như 2 dòng để làm điều đó quát:
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>
{};
Sau đó, một thực hiện 2 dòng is_any_same_to_first
:
template<typename... Ts>
using is_any_same_to_first = is_any_to_first< std::is_same, Ts... >;
Và cho đầy đủ, bản gốc is_all
, mà có thể cũng hữu ích:
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 của is_all_same
.
Lưu ý rằng việc gọi is_any_same_to_first
mọi thứ ít rõ ràng hơn sẽ gây ra sự cố. 2/3 người đã cố gắng trả lời câu hỏi này, bao gồm cả tôi, giả định rằng is_same<A,B,C>
là đúng iff cả ba đều cùng loại!
Kể từ khi ý định của bạn là không rõ ràng (hai người đã thực hiện cùng một cách giải thích sai) Tôi đã tự do nói một chút câu hỏi của bạn. – syam