我有一个庞大的框架,目前使用config structs
实现,它通过单个模板参数传递给类:
配置结构示例如下:
struct AConfig{
struct A{
typedef Data DataType;
... lots of typedefs and other config structs ...
};
struct B{ ... lots of typedefs and other config structs ... };
...
}
这些层次结构包含相关类的typedef,应该在框架中的任何地方使用。
然后我将这些配置注入到框架中的各个类中,例如在文件A.hpp
中:
#include "Manager.hpp"
template<typename AConfig>
class A{
//Macro which expands the AConfig struct hirarchy
// Implementation which does manipulation on DataType classes
DataType a;
a.doIt(); //and so on...
}
这个设计很酷的是:
Data.hpp
文件,可以说Manager.hpp
(最合适的地方(假设))那么我不需要将其重新包括在内再次A.hpp
,因为编译器由于模板而解析了这个..(?)如果我在Data2.hpp
中有另一个Data类实现,那么它会很方便。因此,如果我将相同的文件用于另一个应该使用新类Data2.hpp
文件的项目。我只更改了Config结构,并且在框架中包含了非常单一的结构...... 我真的不确定,如果这种设计方法是一个不错的选择。我想要的是有一些文件TypeDefs.hpp
(其中包含当前我的分层类型定义),它定义了我的整个框架,哪些对象用于哪些类等等。
我想摆脱所有模板化的课程,比如“A”,因为我认为这是不好的实践?我希望能够更改typedef头文件,我不想更改源文件中的#include
语句,我希望我更改的唯一文件是typedef文件(例如替换a class data with another one)
我该如何以最好的方式做到这一点?
答案 0 :(得分:0)
好像你正在实现访问者模式的简化版本。您的AConfig结构是访问者,它在被访问者上执行逻辑 - 框架类。你的方法绝对不是一个坏习惯:你承认它可以节省你的工作。对吧! 您的访问者访问的分离可以改进,并在下面的链接和指针中。该模式似乎适用,因为您有一个庞大的现有类框架,您希望不知道访问者可以对它们执行的新操作,它们只是提供对其数据/计算的访问。
查看When should I use the Visitor Design Pattern?
也许http://rgomes-info.blogspot.co.uk/2013/01/a-better-implementation-of-visitor.html
搜索“double dispatch”,提升任何变体“访客模式”。