在定义模板时始终定义`value_type`是一个好习惯

q09*_*987 38 c++

template<typename T>
class Point
{
public:
    typedef T value_type;
    ...
};
Run Code Online (Sandbox Code Playgroud)

在Ray Lischner的书"C++ in a Nutshell"中看过上面的代码,第176页.

问题:

  1. 总是添加定义是一个好习惯value_type吗?
  2. 这个定义value_type在哪里使用?

例如:Point<int>::value_type

Xeo*_*Xeo 18

拥有一个并没有什么坏处,但它主要只对容器(如std::vector)有意义,因为所有容器都提供了这个typedef和一个统一的接口来访问包含的值(begin/ end,front/ back),尽管这在C +中已经过时了. +11用autodecltype.some_template<typename container::value_type> ...尽管如此,它仍然更清晰.

这反过来意味着它们可以在通用代码中互换使用(事情以这种方式完成的主要原因).如果你的Point班级知道包含的值是什么类型是有道理的,那么就有了typedef.正如我所说,它并没有伤害.但是,我觉得这个特定的例子并没有多大意义.


edu*_*ffy 7

编写在容器上执行的函数是一种很好的做法.例如,如果我编写了一个swap接受容器(模板化)和两个交换索引的函数,那么我可以使用该value_type定义来定义临时变量.

 template<typename T>
 void swap(T &container, int i, int j) {
    typename T::value_type temp = container[i];
    container[i] = container[j];
    container[i] = temp;
 }
Run Code Online (Sandbox Code Playgroud)

  • 在C++ 11中,那就是`auto`.:)请注意,这是`swap`的一个不好的例子,但对于嵌套的`value_type` typedef来说是一个合适的例子. (3认同)