gpt4 book ai didi

c++ - 何时更喜欢基于模板策略的设计而不是基于非模板继承的设计

转载 作者:可可西里 更新时间:2023-11-01 18:39:02 24 4
gpt4 key购买 nike

我试图了解使用模板进行基于策略的设计的真正要求。通过 C++ 中的新模板化设计,我发现基于策略的类设计是一种强烈推荐的设计方式,它允许您从策略类中“插入”不同的行为。一个最小的例子如下(wiki 的简化版本):

template <typename LanguagePolicy>
class HelloWorld : private LanguagePolicy
{
using LanguagePolicy::message;

public:
// Behaviour method
void run() const
{
// policy methods
cout << message();
}
};

class LanguagePolicyA
{
protected:
std::string message() const
{
return "Hello, World!";
}
};
//usage
HelloWorld<LanguagePolicyA> hello_worlda;
hello_worlda.run(); // prints "Hello, World!"

快速分析表明,只是为了获得不同的可插入方法 message(),我们从一个模板化类型继承,该类型的定义可以由任何人提供(并在编译时识别)。

但相同级别的抽象(和可配置方法)可以在不使用模板代码和简单的老式运行时多态性的情况下实现,如下所示。

class HelloWorld
{
LanguagePolicy *lp; //list of all plugable class
public:
HelloWorld(LanguagePolicy *lpn) {
lp = lpn;
}

// Behaviour method
void run() const
{
// policy methods
cout << lp->message();
}
};
class LanguagePolicy
{
protected:
virtual std::string message() const;
};

class LanguagePolicyA: LanguagePolicy
{
protected:
std::string message() const
{
return "Hello, World!";
}
};
//usage
HelloWorld helloworld(new LanguagePolicyA);
helloworld.run();

在功能和抽象级别方面,我认为这两种方法没有太大区别(尽管第二种方法为 LanguagePolicy 增加了一些额外的代码行,但我认为它对于其他用户了解界面;否则理解 LanguagePolicy 取决于文档)。但我确实认为后者是“干净的”(来自不怎么使用模板的人)。这是因为我个人认为非模板类​​更易于查看和理解。一个非常好的例子是流行的库 VTK(可视化工具包),它使用第二种方法解决了许多不同的问题。即使没有大量的 VTK 文档,我们大多数人(它的用户)也可以只看一下它的类图(有时它们很大)并推断出类的行为;并在我们的应用程序中开发高度可配置和复杂的管道(不能将 VTK 成像为基于模板的 :))。相反的是像 STL/BOOST 这样的库,我认为任何人都不可能在不使用大量文档的情况下识别类的工作。

所以我的问题是,基于模板的策略设计真的优于基于虚拟继承的设计吗(仅在这种基于策略的设计场景中)?如果是这样,什么时候以及为什么?

最佳答案

两者都是有效的结构化方式,它实际上取决于需求。例如

运行时与编译时多态性。

你什么时候想要/可以/必须实现多态性?

虚拟调用的性能开销

模板生成没有间接寻址的代码

类的实际使用情况。

当你必须存储异构集合时,需要一个基类,所以你不得不使用继承。

一本关于基于策略的设计的好书(有点过时但仍然不错)是 Modern C++ Design

关于c++ - 何时更喜欢基于模板策略的设计而不是基于非模板继承的设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30596912/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com