我的意思是,除了它的义务名称(标准模板库)......
C++最初的目的是将OOP概念呈现给C.即:您可以基于其类和类层次结构来判断特定实体可以做什么和不可行(不管它是如何做的).由于多重继承的问题,以及C++以某种笨拙的方式支持接口的概念(与java等相比),某些能力组合更难以这种方式描述,但它存在(并且可能是改善).
然后模板与STL一起发挥作用.STL似乎采用了经典的OOP概念,并使用模板代替了它们.
在使用模板来概括类型的情况之间应该有区别,其中类型自身与模板的操作无关(例如,容器).有一个vector<int>完美的感觉.
但是,在许多其他情况下(迭代器和算法),模板化类型应该遵循"概念"(输入迭代器,前向迭代器等等),其中概念的实际细节完全由模板的实现定义函数/类,而不是与模板一起使用的类的类,这是对OOP的一种反对使用.
例如,您可以告诉函数:
void MyFunc(ForwardIterator<...> *I);
Run Code Online (Sandbox Code Playgroud)
更新:由于在原始问题中不清楚,因此ForwardIterator可以自行模板化以允许任何ForwardIterator类型.相反,将ForwardIterator作为一个概念.
只需通过查看其定义来预期转发迭代器,您需要查看实现或文档:
template <typename Type> void MyFunc(Type *I);
Run Code Online (Sandbox Code Playgroud)
我可以支持使用模板的两个声明:通过为每个使用的类型定制编译模板,而不是使用vtable,可以提高编译代码的效率.并且模板可以与本机类型一起使用.
但是,我正在寻找一个更为深刻的理由,为什么放弃传统的OOP而不是模仿STL呢?(假设你读到那么远:P)
C++中没有类似的(Java)Collection概念.
我能理解其中的原因,但我想知道是否有任何方法可以优雅地伪造它.
我已经实现了很多自定义Collection.
它们都具有Iterator走时准确,类似std::vector,std::unordered_set等等.
他们是 MyArray<T>,MyBinaryTree<T>和MySet<T>.
在这里,我将展示一个工作代码,显示我想要伪造它的位置.
假设我有两个级别的程序:库和用户.
它只做一件事 - User命令Library吃掉Orange*桶里的所有东西.
Library.h
class Library{
public: static void eatAll(const MyArray<Orange*>& bucket);
};
Run Code Online (Sandbox Code Playgroud)
Library.cpp
#include "Orange.h"
void Library::eatAll(const MyArray<Orange*>& bucket){
for(auto orange:bucket){
orange->eaten();
}
}
Run Code Online (Sandbox Code Playgroud)
User.h
MyArray<Orange*> bucket;
Library::eatAll(bucket);
Run Code Online (Sandbox Code Playgroud)
没关系.
现在,我Library::eatAll也想支持MyBinaryTree<Orange*>,我有一些不太理想的方法,如下所示.
MyBinaryTree<T>和MyArray<Orange*>(及它们的迭代器)继承自一个新类Collection<T>(和CollectionIterator<T>).