gpt4 book ai didi

c++ - 删除嵌套类型中的所有包装器类型

转载 作者:行者123 更新时间:2023-11-30 05:10:24 25 4
gpt4 key购买 nike

是否可以编写一个元函数,给定一个具有多次出现的特定类型的类型 template<class> class Decor , 返回不出现类 Decorator 的类型.

一个例子是转换以下类型 A<Decor<T<B<A<Decor<C>>>>>>进入 A<T<B<A<C>>>>

我们假设最终类型的结构确实是正确的类型,但我们不对输入类型的结构做任何假设。可能是某些用于构造输入类型的类型的形式为 template<class...> class或任何其他类型类。

最佳答案

您可以使用一个类模板和一些像这样的特化:

template<typename T>
struct RemDec {
using type = T;
};

template<template<typename...> class C, typename... T>
struct RemDec<C<T...>> {
using type = C<typename RemDec<T>::type...>;
};

template<typename T>
struct RemDec<Decorator<T>> {
using type = typename RemDec<T>::type;
};

类模板有助于停止迭代类型链。
第一个特化记住一个类模板并帮助清理剩下的部分。
最后一个特化删除检测到的 Decorator 并继续分析剩余的内容。


它遵循一个最小的工作示例:

#include<type_traits>

template<typename>
struct Decorator {};

template<typename...>
struct S {};

template<typename T>
struct RemDec {
using type = T;
};

template<template<typename...> class C, typename... T>
struct RemDec<C<T...>> {
using type = C<typename RemDec<T>::type...>;
};

template<typename T>
struct RemDec<Decorator<T>> {
using type = typename RemDec<T>::type;
};

int main() {
static_assert(std::is_same<
typename RemDec<S<Decorator<S<S<Decorator<S<int>>>>>, Decorator<S<double>>>>::type,
S<S<S<S<int>>>, S<double>>
>::value, "!");
}

运行它可以看到,Decorator 的任何实例 都已从原始类型中删除。

关于c++ - 删除嵌套类型中的所有包装器类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45697953/

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