gpt4 book ai didi

c++ - 检测类型

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:02:00 25 4
gpt4 key购买 nike

忽略此题,刚发现我的代码有错误,标记删除

这来自“模板 - 完整指南”ch。 19.2
复合类型是从其他类型构造的类型。简单的复合类型包括普通类型、指针类型、引用类型,甚至数组类型。它们由单一的基本类型构成。类类型和函数类型也是复合类型,但它们的组合可以涉及多种类型(对于参数或成员)。可以使用偏特化对简单复合类型进行分类。我们从 traits 类的通用定义开始,描述类类型和枚举类型以外的复合类型(后者单独处理):

// types/type2.hpp 
template<typename T>
class CompoundT { // primary template
public:
enum { IsPtrT = 0, IsRefT = 0, IsArrayT = 0,
IsFuncT = 0, IsPtrMemT = 0 };
typedef T BaseT; //This suppose to be different
typedef T BottomT; //to this! But is typedef'ed in the same way! FFS!
typedef CompoundT<void> ClassT;
};

成员类型 BaseT 是模板参数类型 T 所基于的直接类型的同义词。另一方面,BottomT 指的是构建 T 的最终非指针、非引用和非数组类型。例如,如果 T 是 int*,则 BaseT 将是 int,而 BottomT 将是 int。
那样做了,试过了,然后猜猜是什么不起作用。对于 int** BaseT 是 int** 并且对于 BottomT 是一样的。对我来说,这本书显然有错误。相同类型定义的类型究竟有何不同?对我来说不能。我想知道应该有什么(在类声明中)让它工作。
谢谢。

最佳答案

那么专业在哪里?是的,如果我理解正确的话,这是应该为非复合类型实例化的主要模板。自然,光靠这个模板,什么也做不了。另一方面,让我们考虑指针的特化(对于数组等,它是类似的)

template<typename T> 
class CompoundT<T*> { // specialization for pointers
public:
enum { IsPtrT = 1, IsRefT = 0, IsArrayT = 0,
IsFuncT = 0, IsPtrMemT = 0 };
typedef T BaseT;
typedef typename CompoundT<BaseT>::BottomT BottomT;
typedef CompoundT<void> ClassT; //not sure what this is for
};

现在,对于 int** baseT 将是 int* 而 BottomT 将是 int。

关于c++ - 检测类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3896853/

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