Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/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++ 模板配置参数VS包含文件_C++_Templates_Configuration - Fatal编程技术网

C++ 模板配置参数VS包含文件

C++ 模板配置参数VS包含文件,c++,templates,configuration,C++,Templates,Configuration,我有一个巨大的框架,目前是用configstructs实现的,它通过一个模板参数传递给类: 例如,配置结构如下所示: struct AConfig{ struct A{ typedef Data DataType; ... lots of typedefs and other config structs ... }; struct B{ ... lots of typedefs and other config structs ... }; ... } 这些

我有一个巨大的框架,目前是用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... 

}
#包括“Manager.hpp”
模板
甲级{
//宏,用于扩展AConfig结构HIRACHY
//对数据类型类进行操作的实现
数据类型a;
a、 doIt();//等等。。。
}
这种设计最酷的地方是:

struct AConfig{
  struct A{ 
   typedef Data DataType;
   ... lots of typedefs and other config structs ... 

  };
  struct B{ ... lots of typedefs and other config structs ... };
  ...
}
  • 通过使用一个单个模板参数,我可以防止如果不使用这些分层配置结构,我的模板声明会变得很长
  • 我可以很容易地更改配置结构中的typedef,以便在我的框架中使用其他类实现,这些定义只是被注入到所有的类中
  • 如果我只在
    Manager.hpp
    中包含
    Data.hpp
    文件(在最合适的地方(假设)),那么我不需要再次将其包含在
    A.hpp
    中,因为编译器会根据模板解决此问题如果我在
    Data2.hpp
    中有另一个数据类的实现,这将非常方便。因此,如果我在另一个项目中使用相同的文件,它应该使用新的类
    Data2.hpp
    文件。我只改变了配置结构和框架中的单个包含
  • 一个缺点是编译时间非常长,因为编译器必须解析所有这些依赖的类型名等等
我真的不确定,如果这个设计方法是一个好的选择。我想要的是有一些文件
TypeDefs.hpp
(它目前包含我的分层TypeDefs),它定义了我的整个框架,在哪些类中使用了哪些对象,等等。 我想摆脱我所有的模板类,比如“A”,因为我认为这是个糟糕的做法?。我希望能够对typedef头文件进行更改,并且我不希望更改源文件中的
#include
语句,我希望我更改的唯一文件是typedef文件(例如,用另一个替换类数据)

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

    -
看起来您正在实现访问者模式的简化版本。AConfig结构是对已访问的框架类执行逻辑的访问者。而且你的方法绝对不是一个坏习惯:你承认这可以节省你的工作。没错! 您的访客访问分离可以得到改进,这在下面的链接和指针中。该模式似乎是适用的,因为您有一个大型的类框架,您希望不知道访问者可以对其执行的新操作,它们只提供对其数据/计算的访问

退房

也许


搜索“双重分派”,增强任何变体的“访客模式”。

很有趣的答案,但我不知道这是否有助于进一步=),还不知道如何应用它。实际上,我使用AConfig结构只是为了分层收集框架的“typedef”(这些结构中没有逻辑)