Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ traits类是如何工作的,它们是做什么的?_C++_Traits - Fatal编程技术网

C++ traits类是如何工作的,它们是做什么的?

C++ traits类是如何工作的,它们是做什么的?,c++,traits,C++,Traits,我在读斯科特·迈尔斯的。他说的是traits类,我知道我需要它们在编译期间确定对象的类型,但我不理解他对这些类实际做什么的解释?(从技术角度来看)Traits类不确定对象的类型。相反,它们提供了关于类型的附加信息,通常是通过在trait中定义typedef或常量来实现的。也许你期待着某种类型trait的魔力。在这种情况下,失望吧——没有魔法。类型特征是为每个类型手动定义的。例如,考虑迭代器特性,它为迭代器提供Type Debug(例如,代码> ValueSype类型/代码>)。 使用它们,你可以

我在读斯科特·迈尔斯的。他说的是traits类,我知道我需要它们在编译期间确定对象的类型,但我不理解他对这些类实际做什么的解释?(从技术角度来看)

Traits类不确定对象的类型。相反,它们提供了关于类型的附加信息,通常是通过在trait中定义typedef或常量来实现的。

也许你期待着某种类型trait的魔力。在这种情况下,失望吧——没有魔法。类型特征是为每个类型手动定义的。例如,考虑<代码>迭代器特性,它为迭代器提供Type Debug(例如,代码> ValueSype类型/代码>)。

使用它们,你可以写作

iterator_traits<vector<int>::iterator>::value_type x;
iterator_traits<int*>::value_type y;
// `x` and `y` have type int.
iterator\u traits::value\u type x;
迭代器特征::值类型y;
//`x`和`y`具有int类型。
但为了实现这一点,实际上在
标题的某个地方有一个明确的定义,如下所示:

template <typename T>
struct iterator_traits<T*> {
    typedef T value_type;
    // …
};
模板
结构迭代器{
类型定义T值_类型;
// …
};
这是
iterator\u traits
类型对
T*
形式类型的部分特殊化,即某些泛型类型的指针


同样,
iterator\u traits
专门用于其他迭代器,例如,
typename vector::iterator

+1表示无魔力。尽管如此,难道没有一些特性(例如在C++0x标准库中)不能仅使用该语言可靠地定义,并且需要特殊的“魔力”吗编译器对工作的帮助?@UncleBens:我不知道C++0x定义了哪些特性,但我确信在C++0x之前不存在这样的特性。现在这不是一种魔法吗?@Wolf C++11添加了一些无法在用户端实现的特性,它们需要编译器支持。是的,
std::底层的_类型
就是其中之一。@Wolf好吧,答案在C++11出现之前很久就已经写好了。