Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 抽象类与模板-良好实践_C++_C++11_Coding Style - Fatal编程技术网

C++ 抽象类与模板-良好实践

C++ 抽象类与模板-良好实践,c++,c++11,coding-style,C++,C++11,Coding Style,假设我有一个代表算法的类,这个算法需要数据中的一些特殊的东西(例如,一些成员函数) 在示例中,我们可以做到: <<interface>> +------------------------+ +------------+ | Algorithm | <<uses>> | Data | +--

假设我有一个代表算法的类,这个算法需要数据中的一些特殊的东西(例如,一些成员函数)

在示例中,我们可以做到:

                                          <<interface>>
+------------------------+               +------------+
|       Algorithm        |    <<uses>>   |    Data    |
+------------------------+-------------->+------------+
| + doJob(inData : Data) |               | +getPixel()|
+------------------------+               +------------+

+------------------------+               +------------+
|算法| |数据|
+------------------------+-------------->+------------+
|+doJob(inData:Data)| |+getPixel()|
+------------------------+               +------------+
我们可以强制算法的用户每次使用类算法时都从数据中继承。我们还可以制作一个模板:

template<typename T>
doJob(T&& inputData){
   //implementation
}
模板
doJob(T&&inputData){
//实施
}
(没有类的函数可以简化事情)

我们强迫我们的客户创建具有专有名称的方法的类,但我们不让他实现我们的抽象类(不同语言的接口)(性能可能会更好一点?)

我的问题是:

哪种方法更好

  • 当我们有选择的时候,我们应该在库中以模板方式还是抽象方式实现东西

  • 标准是否有理由不定义一些标准“接口”,如std::container或std::factory(只是示例)


    • 这似乎是一个基于观点的问题。强迫客户履行其义务的最好方法是让他签署一份合同,该合同是一个接口。

      实际上,你有不止一个问题,让我们逐一回答:

      哪种方法更好

      总的来说,两者都不好。各有优缺点。但你确实发现了一个有趣的问题:在更抽象的层面上,这两者几乎是一样的

      当我们有选择的时候,我们应该在库中以模板方式还是抽象方式实现东西

      通过模板,您可以获得:

    • 一般来说,执行速度更快。它可以更快,因为可以进行大量的内联,然后进行优化。OTOH,有了一个高级的反虚拟化编译器/链接器和一些无法内联/优化的函数,您可能会获得几乎相同的速度

    • 编译速度较慢。它可能会慢得多,特别是如果您采用“奇特的模板元编程”方式

    • 更糟糕的编译器错误。它们可能会更糟糕,尤其是如果您采用“奇特的模板元编程”方式。当C++获得概念的支持时,应该避免这种情况。

    • 如果仔细设计,可以提高类型安全性。OTOH,如果你不小心的话,你的鸭子打字会比Smalltalk更糟糕。概念将是一种工具,在这方面也会有所帮助

    • 通过虚拟函数/接口,您可以获得:

    • 去耦合设计,如果你小心的话,一个文件的更改不需要重新编译其他文件,编译时间可以快得多
    • 运行时多态性,这意味着您可以动态加载代码(这并不像听起来那么容易,但是,这是可能的)
    • 在OO方面有经验的人看起来更熟悉的东西
    • 标准是否有理由不定义一些标准“接口”,如std::container或std::factory(只是示例)


      我想,人们可能会发现很多“低级”原因,但最根本的原因是性能。也就是说,STL的设计目标是“尽可能快”,如果现在不可能,那么将一些(有用的)接口“放在上面”。如果是这样,为什么标准库或boost(通常被认为是非常高级和酷的)只使用模板?你能举一个更具体的例子吗?您可能需要一个接口,但它没有被使用。例如,迭代器并没有从公共接口继承,但它们可以。容器也不会从公共接口继承。我认为使用迭代器是因为指针算法与Java、.Net.Java不同。Java的AbstractCollection实现了Iterable,它有一个方法interator()返回Iterator.great answer。非常感谢:)