【发布时间】:2018-04-30 12:17:30
【问题描述】:
在我的设计中,我有一个针对大量参数进行模板化的类(让它成为Shell)。这些参数中的大多数是我在项目中定义的其他类,因为我为我的项目选择了基于策略的设计方法。
类声明如下所示:
template <class int_t, class float_t, class Pol1, class Pol2,..., class PolN>
class Shell : Pol1, Pol2,...,PolN
前两个参数是应使用的整数和浮点类型。其余参数是项目中定义的特定策略。
这种设计对我来说很方便,因为它可以避免很多运行时检查(我们的目标是运行时性能)。然而,每当他/她想要创建Shell 类的实例时,输入一个包含 10 多个参数的列表是非常麻烦的(从用户的角度来看)。
出于这个原因,我选择将这个打字负担连同宏一起移到一个单独的文件中。首先,我将所有策略默认为一个宏:
template <class int_t, class float_t, class Pol1 = DEF_1, class Pol2 = DEF_2,..., class PolN = DEF_N>
class Shell : Pol1, Pol2,...,PolN
模板参数可以在单独的文件中作为宏提供,而不是在求解器的声明中。例如:
#include <shell.cpp>
#define DEF_1 example1
#define DEF_2 example2
...
#define DEF_N exampleN
int main(){
Shell<int,double> MyShell();
return 0;
}
这样,实例化类只需要传递给模板参数(其他+10参数通过宏传递)。定义甚至可以移动到单独的文件中,如下所示:
#include <shell.cpp>
#include "define.hpp"
这只是一种解决方法,因此不必在每次创建类的实例时都提供 10 多个参数的参数列表。宏是迄今为止我发现的最好的解决方案。但是,我知道宏在大多数 C++ 应用程序中并不是“推荐”的解决方案。
出于这个原因,我想知道这是否是一个典型问题,以及如何在没有宏的情况下克服它。我还想知道宏是否是一个“好的”解决方案,或者我是否应该不惜一切代价避免这种设计。我将不胜感激有关此主题的任何帮助/评论,因为我对 C++ 很陌生 :)
【问题讨论】:
-
你的例子没有建立。如果包含顺序与您指定的一样,则不会替换这些宏。或者如果
#define通常排在第二位。 -
您可以让它们在单个
typename PolicySet中输入别名,而不是制作Pol1..Poln模板参数。 -
[OT]:避免包含 cpp 文件:
#include <shell.cpp>、.hpp、.inl、.hxx 会是更好的扩展名。 -
Shell<int,double> MyShell();: 恼人的解析:函数声明,你可能想要Shell<int,double> MyShell{};或Shell<int,double> MyShell;代替。 -
嗨@HolyBlackCat,这里的别名是什么意思?你的意思是像@Jarod42 提出的解决方案吗?或者更像@MaxLanghof 的解决方案?
标签: c++ templates macros policy-based-design