using Filter = MetaList{}() for ev-6ren">
gpt4 book ai didi

c++ - 为 type_traits 类创建一个 "negate"包装器

转载 作者:太空狗 更新时间:2023-10-29 20:39:15 26 4
gpt4 key购买 nike

假设我有一个过滤类型列表的 Filter 元函数:

template<template<typename> class TFilter, typename... Ts> 
using Filter = MetaList</* check TFilter<T>{}() for every type in Ts... */>;

元函数可以这样使用:

Filter<std::is_pod, int, char, std::string, int>
// ...returns...
MetaList<int, char, int>

现在,我想获取所有不是 POD 的类型。我可以创建一个 FilterNot 元函数,但实际上我还需要其他元函数中的“否定”。

是否可以为任何类似type-trait的模板类创建否定包装器?

所需代码:

Filter<Negate<std::is_pod>, int, char, std::string, int>
// ...returns...
MetaList<std::string>

最佳答案

template<template<class...>class Z>
struct negate {
template<class...Ts>
using result=std::integral_constant<bool, !Z<Ts...>::value>;
};
Filter<negate<std::is_pod>:: template result, int, char, std::string, int>;

Filter<typename negate<std::is_pod>::result, int, char, std::string, int>;

取决于编译器应该工作。 (IIRC,一些编译器对此很古怪)

因为我发现这种语法很尴尬,也许可以将测试列表带到菊花链上?那么否定只是堆栈上的另一个特征:

template<template<class...>class... Zs>
struct tests {};

然后拿一个tests并申请 Zs递归地。

template<class B>
using negate=std::integral_constant<bool,!B::value>;

filters<tests<negate, std::is_pod>, int, std::string>

另一种方法是进行测试并使它们在 tag<type>{} 上运行 constexpr 函数(容易做),在语法上更容易编写。来自 template<class>classconstexpr bool(tag<class>)不难。

关于c++ - 为 type_traits 类创建一个 "negate"包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28385582/

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