相关疑难解决方法(0)

为什么C++ STL基于模板如此重要?(而不是*接口*)

我的意思是,除了它的义务名称(标准模板库)......

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++ oop templates stl

210
推荐指数
9
解决办法
3万
查看次数

C++不鼓励收集基类 - 无论如何都要伪造它?

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*>,我有一些不太理想的方法,如下所示.

我的解决方案不好

1. Java方式

  • Make MyBinaryTree<T>MyArray<Orange*>(及它们的迭代器)继承自一个新类Collection<T>(和CollectionIterator<T>).
  • 将签名更改为 …

c++ containers templates c++11

11
推荐指数
1
解决办法
966
查看次数

标签 统计

c++ ×2

templates ×2

c++11 ×1

containers ×1

oop ×1

stl ×1