这个元编程逻辑可以简化吗,[关闭]

问题描述 投票:0回答:1

我还在学习元编程,

我正在学习一些在线课程,

我有这个逻辑来检查类型列表中是否有类型。

我想知道是否可以使用 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++ metaprogramming
1个回答
2
投票

是的,通过使用折叠表达式,它是 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>...>{};
© www.soinside.com 2019 - 2024. All rights reserved.