gpt4 book ai didi

c++ - 过滤参数包的类型

转载 作者:可可西里 更新时间:2023-11-01 17:41:25 26 4
gpt4 key购买 nike

我想知道是否可以过滤传递给可变模板(基于谓词模板)的类型以生成另一个包含满足谓词的类型的可变模板:

/** Filter a parameter pack */    
template <template <class> class,
template <class...> class,
class...>
struct filter;
template <template <class> class Pred, template <class...> class Variadic>
struct filter<Pred, Variadic> : Variadic<>
{};
template <template <class> class Pred,
template <class...> class Variadic,
class T, class... Ts>
struct filter<Pred, Variadic, T, Ts...>
{
// FIXME: this just stops at first T where Pred<T> is true
using type = typename std::conditional<
Pred<T>::value,
Variadic<T, Ts...>, // can't do: Variadic<T, filter<...>>
filter<Pred, Variadic, Ts...> >::type;
};

如您所见,我还没有找到从其余过滤类型中“提取”参数包的方法。

提前致谢!

最佳答案

这应该是相当直截了当的。你的核心应该是这样的:

template <typename...> struct filter;

template <> struct filter<> { using type = std::tuple<>; };

template <typename Head, typename ...Tail>
struct filter<Head, Tail...>
{
using type = typename std::conditional<Predicate<Head>::value,
typename Cons<Head, typename filter<Tail...>::type>::type,
typename filter<Tail...>::type
>::type;
};

你只需要 Cons<T, Tuple> , 变成 T, std::tuple<Args...>进入std::tuple<T, Args...> ,并且您需要传递谓词(留作练习)。 Cons可能看起来像这样:

template <typename, typename> struct Cons;

template <typename T, typename ...Args>
struct Cons<T, std::tuple<Args...>>
{
using type = std::tuple<T, Args...>;
};

filter<Args...>::type 的结果将是 std::tuple<Brgs...> , 其中Brgs...是一个仅由 Args... 中的那些类型组成的包谓词对其成立。

关于c++ - 过滤参数包的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18366398/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com