gpt4 book ai didi

C++ 元编程创建一个新的类型列表,并将 remove_const 应用于每个元素

转载 作者:搜寻专家 更新时间:2023-10-31 01:22:38 25 4
gpt4 key购买 nike

嗨谁能给我一个示例程序来“创建一个 ApplyRemoveConst 模板构造一个新的类型列表,并将 remove_const 应用于每个元素”

例如:

typedef TYPELIST_3(A, const B, B) TL;
typedef ApplyRemoveConst<TL>::Result TL2;
// TL2 is the same as TYPELIST_3(A, B, B)


//Typelist Definition:

template<class T, class U>
struct Typelist
{
typedef T Head;
typedef U Tail;
// Lets us a print a typelist
inline static ostream &print(ostream &os) {
return printInternal(os, "[");
}
inline static ostream &printInternal(ostream &os, string delimiter) {
os << delimiter << typeid(Head).name();
return Tail::printInternal(os, ", ");
}
private:
Typelist(); // Cannot create!
};

#define TYPELIST_1(T1) Typelist<T1, NullType>
#define TYPELIST_2(T1, T2) Typelist<T1, TYPELIST_1(T2)>
#define TYPELIST_3(T1, T2, T3) Typelist<T1, TYPELIST_2(T2, T3)>

// Null type definition

class NullType{
public:
// NullType ends a typelist (just like NULL ends a C string)
inline static ostream &printInternal(ostream &os, string delimiter) {
return os << "]";
}
};

最佳答案

我想你想要的是这样的:

template <typename, template <typename> class>
struct transform;

template <template <typename> class Func>
struct transform<NullType, Func>
{
typedef NullType type; // nothing to do
};

template <typename T, typename U, template <typename> class Func>
struct transform<Typelist<T, U>, Func>
{
typedef typename Func<T>::type Head; // apply to head
typedef typename transform<U, Func>::type Tail; // tail is transformed tail

typedef Typelist<Head, Tail> type; // put together
};

这会递归地应用一些东西。它创建一个新列表,通过应用到头部,然后将其他所有内容作为尾部应用。依次应用 head,依此类推,直到到达 NullType,我们将在其中获得 NullType

那么你只需要一个元仿函数:

template <typename T>
struct remove_const
{
typedef T type;
};

template <typename T>
struct remove_const<const T>
{
typedef T type;
};

然后把它们放在一起:

typedef TYPELIST_3(A, const B, B) TL;
typedef transform<TL, remove_const>::type TL2;
// TL2 is the same as TYPELIST_3(A, B, B)

需要注意的是我还没有尝试过这些。

关于C++ 元编程创建一个新的类型列表,并将 remove_const 应用于每个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2635036/

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