我还在学习元编程,
我正在学习一些在线课程,
我有这个逻辑来检查类型列表中是否有类型。
我想知道是否可以使用 c++20 简化这种元编程逻辑例程。任何帮助将不胜感激。
#include<iostream>
#include<type_traits>
template<bool condition, typename THEN, typename ELSE>
struct check;
template<typename THEN, typename ELSE>
struct check<true, THEN, ELSE>{
using type = THEN;
};
template<typename THEN, typename ELSE>
struct check<false, THEN, ELSE>{
using type = ELSE;
};
template<typename...>
struct my_lst{};
template<typename L>
struct empty: std::false_type{};
template<>
struct empty<my_lst<>> : std::true_type{};
template<typename L>
struct top;
template<typename T, typename ...args>
struct top<my_lst<T, args...>>{
using type = T;
};
template<typename L>
struct pop_top;
template<typename T, typename ...args>
struct pop_top<my_lst<T, args...>>{
using type = my_lst<args...>;
};
//create some alisaes
template<typename L>
using top_t = typename top<L>::type;
template<typename L>
using pop_top_t = typename pop_top<L>::type;
template<typename L>
static constexpr bool empty_v = empty<L>::value;
template<typename SEARCH, typename L>
struct contains_type :
check< std::is_same_v<SEARCH, top_t<L>>, std::true_type, contains_type<SEARCH, pop_top_t<L>> >::type{};
template<typename SEARCH>
struct contains_type<SEARCH, my_lst<>>: std::false_type{};
int main()
{
my_lst<int, bool, double> types;
std::cout << contains_type<bool, my_lst<>>::value << '\n';
std::cout << contains_type<bool, decltype(types)>::value << '\n';
std::cout << contains_type<float, decltype(types)>::value << '\n';
}
是的,通过使用折叠表达式,它是 c++17
template<typename...>
struct my_lst{};
template<typename T, typename U>
struct contains_type;
template<typename T, typename ...Args>
struct contains_type<T,my_lst<Args...>>
: std::conditional_t<
(std::is_same_v<T,Args> || ...),
std::true_type,
std::false_type
>{};
或按照@AndyG的建议,
std::disjunction
(也是c++17)
template<typename T, typename ...Args>
struct contains_type<T,my_lst<Args...>>
: std::disjunction<std::is_same<T,Args>...>{};