type,value_type和element_type之间有什么区别,以及何时使用每个?

时间:2017-03-28 07:59:51

标签: c++ c++11

我编写了一个应该公开其模板参数的模板类,但我不确定它是否适当命名。

我找到了三个基本相同的不同名称(据我所知):

  • 容器,例如var $this->param使用std::vector
  • 智能指针,例如value_type使用std::unique_ptr
  • element_type仅使用std::reference_wrapper

这些不同名字背后的想法是什么?什么标准算法或特征类取决于哪个名称?我应该为我的班级使用哪个名称(智能指针和参考包装器之间的东西)?

2 个答案:

答案 0 :(得分:6)

value_type是容器的成员类型(以及迭代器等)。它提供了一个对象的类型,通常是一个完整的对象,您可以创建或观察它。 value_type - 协变模板之间没有投射。

element_type是智能指针的成员类型。它提供了被观察对象的类型。通常智能指针管理完整的对象,但它们也可以转换为基础子对象。

type是元函数的成员类型。通常它没有描述任何特定的对象。

答案 1 :(得分:4)

value_type是定义容器时要定义的大家族的一部分:

typedef T value_type;
typedef T& reference;
typedef const T& const_reference;
typedef long size_type;
typedef size_type difference_type;

除了迭代器typedef之外,STL算法还使用它们以不可知的方式处理容器,而不知道容器的类型。这就是为什么相同的算法适用于std::vectorstd::deque和所有其他STL容器的原因。

另一方面,std::unique_ptrstd::reference_wrapper具有完整性的typedef,并使开发人员也可以推断出类型。例如,考虑一下情况:

typedef std::vectory<double> MyGreatArray;
//Do stuff with MyGreatArray
//What is the type inside MyGreatArray? I want to assign a single element
MyGreatArray::value_type one_element; //now one_element is a double!
MyGreatArray::iterator MyGreatArrayIt; //now this is an iterator vector<double>
one_element = 1.0;
MyGreatArrayIt = MyGreatArray.begin();

(PS:当然你可以使用auto,但在C ++ 11之前就是这种情况)

所以你看,你将始终引用容器内的类型。无论它是STL容器还是std::unique_ptr都无关紧要,在模板类中引用模板类型是一种不错的做法,无论它是什么&#39 ; S。由于STL和C ++标准旨在普遍性,因此您总是会在类中找到模板类型的引用。这将使您所做的每件事都更容易独立于您在模板中放置的类型。

编辑:

&#34;为什么他们有不同的名字?&#34;答:只是为了避免含糊不清。考虑应该采用容器并且仅需要value_type的算法。当名称不同时,您可以添加额外的保护,以防止灾难性的运行时错误。请记住,一切都变得与类型无关。我们想要的最后一件事是通过将所有内容称为value_type来实现另一个错误来源。