Jam*_*lis 22
在继承层次结构中使用没有数据成员的类通常很有用.
基类可能只有几个typedef在多个类中使用的s.例如,std::iterator类模板只定义了标准类型,因此您无需在每个迭代器类中定义它们.
接口类通常没有数据成员,只有虚拟成员函数.
虚拟表与类的数据成员无关.
好吧,实际上C++要求所有类必须占用一些空间(您需要能够生成指向该类的指针).如果类是多态的,它们只需要一个指向vtable的指针.在单形课中根本没有理由说vtable.
我正在开发一个有时甚至使用类型的库 - 喘气!- 甚至没有定义,更不用说有数据成员了!
也就是说,类型不完整,例如
struct foobar;
Run Code Online (Sandbox Code Playgroud)
这用于创建一个明确的名称,仅此而已.
那有什么用呢?好吧,我们使用它来创建不同的标签,使用额外的(空的,但完全定义的)类型:
template <typename TSpec>
struct Tag { };
Run Code Online (Sandbox Code Playgroud)
现在你可以像这样创建不同的标签:
struct TagForward_;
typedef Tag<TagForward_> ForwardTag;
struct TagRandomAccessible_;
typedef Tag<TagRandomAccessible_> RandomAccessibleTag;
Run Code Online (Sandbox Code Playgroud)
这些反过来可用于消除专门的重载歧义.许多STL实现都做类似的事情:
template <typename Iter>
void sort(Iter begin, Iter end, RandomAccessibleTag const&) …
Run Code Online (Sandbox Code Playgroud)
严格地说,通过公共Tag类模板的间接路由是多余的,但是为了文档起见它是一个有用的技巧.
所有这些只是为了表明(严格的,静态的)类型系统可以以多种不同的方式使用,而不仅仅是捆绑和封装数据.