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

b4lqfgs4  于 2023-03-14  发布在  其他
关注(0)|答案(1)|浏览(128)

**已关闭。**此问题不符合Stack Overflow guidelines。当前不接受答案。

这个问题似乎与help center中定义的范围内的编程无关。
3小时前关门了。
Improve this question
我还在学习元编程,
我在上一些在线课程,
我用这个逻辑来检查类型列表中是否有一个类型。
我想知道这个元编程逻辑例程是否可以用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';
}
oxcyiej7

oxcyiej71#

是的,使用折叠表达式,它是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>...>{};

相关问题