我编写了一个模板类,它应该公开它的模板参数,但我不确定它是否适当命名.
我找到了三个不同的名字,基本上是相同的东西(据我所知):
std::vector使用value_typestd::unique_ptr使用element_typestd::reference_wrapper 只使用 type这些不同名字背后的想法是什么?什么标准算法或特征类取决于哪个名称?我应该为我的班级使用哪个名称(智能指针和参考包装器之间的东西)?
value_type是容器的成员类型(和迭代器等).它提供了一个对象的类型,通常是一个完整的对象,您可以创建或观察它.value_type-covariant模板之间没有转换.
element_type是智能指针的成员类型.它提供了被观察对象的类型.通常智能指针管理完整的对象,但它们也可以转换为基础子对象.
type是元函数的成员类型.通常它不描述任何特定的对象.
value_type 是定义容器时要定义的一大堆东西的一部分:
typedef T value_type;
typedef T& reference;
typedef const T& const_reference;
typedef long size_type;
typedef size_type difference_type;
Run Code Online (Sandbox Code Playgroud)
除了iterators之外,这些还typedef由STL算法使用,以不可知的方式处理您的容器,而不知道您的容器的类型。这就是为什么同样的算法工作的理由std::vector,std::deque和所有其他的STL容器。
在另一方面,std::unique_ptr并且std::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();
Run Code Online (Sandbox Code Playgroud)
(PS:您当然可以使用auto,但是即使在C ++ 11之前也是如此)
因此,您将看到容器内始终有对该类型的引用。不论是STL容器还是STL容器std::unique_ptr都没有关系,无论它是什么,在模板类中都包含对模板类型的引用是一种好习惯。由于STL和C ++标准着眼于通用性,因此您始终会在类内找到模板类型的引用。这将使您所做的一切变得更容易,而不必依赖于模板中放置的类型。
编辑:
“为什么他们有不同的名字?” 答:只是为了避免歧义。考虑一种应采用容器且仅需一个的算法value_type。名称不同时,可以添加额外的保护,以防止灾难性的运行时错误。请记住,一切都变得与类型无关。我们想要的最后一件事是通过调用一切都导致错误的另一个来源value_type。