模板配置参数VS包含文件

时间:2013-12-01 18:46:56

标签: c++ templates configuration

我有一个庞大的框架,目前使用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 ... };
  ...
}

这些层次结构包含相关类的t​​ypedef,应该在框架中的任何地方使用。

然后我将这些配置注入到框架中的各个类中,例如在文件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... 

}

这个设计很酷的是:

  • 通过使用一个单个模板参数,如果我不使用这些分层配置结构,我会阻止我的模板声明会变得很长。
  • 我可以非常轻松地更改配置结构中的typedef,以便在我的框架中使用其他类实现,这些定义只会被注入到各个类中。
  • 如果我包含例如Data.hpp文件,可以说Manager.hpp(最合适的地方(假设))那么我不需要将其重新包括在内再次A.hpp,因为编译器由于模板而解析了这个..(?)如果我在Data2.hpp中有另一个Data类实现,那么它会很方便。因此,如果我将相同的文件用于另一个应该使用新类Data2.hpp文件的项目。我只更改了Config结构,并且在框架中包含了非常单一的结构......
  • 一个缺点是编译时间非常长,因为编译器必须解析所有这些依赖的类型名称等等......

我真的不确定,如果这种设计方法是一个不错的选择。我想要的是有一些文件TypeDefs.hpp(其中包含当前我的分层类型定义),它定义了我的整个框架,哪些对象用于哪些类等等。 我想摆脱所有模板化的课程,比如“A”,因为我认为这是不好的实践?我希望能够更改typedef头文件,我不想更改源文件中的#include语句,我希望我更改的唯一文件是typedef文件(例如替换a class data with another one)

我该如何以最好的方式做到这一点?

      -

1 个答案:

答案 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”,提升任何变体“访客模式”。