【发布时间】:2020-05-29 15:48:18
【问题描述】:
是否有可能有一个 C++ 模板,其中模板参数可以作为另一个现有(更长)类型名的前缀或后缀。我正在使用从 IDL(接口定义)生成的代码,因此有许多具有相关名称的生成类。例如,如果 IDL 定义了“Foo”,我将生成以下类列表。
Foo, FooReader, FooWriter, FooSerializer, ...
我正在尝试为每个生成的类型创建一个包含成员变量的类...理想情况下,我可以使用Wrapper<Foo> obj; 声明对象
我可以这样做:
#define EXPANDTEMPLATE(type) Wrapper<type, type##Reader, type##Writer, ... >
template <typename T, typename TReader, typename TWriter, ...> class Wrapper {
T var1;
TReader var2;
TWriter var3;
...
};
int main(){
EXPANDTEMPLATE(Foo) obj;
//do stuff
}
在我的情况下,默认构造函数不会是一个问题,所以这个工作,但我更喜欢不会导致代码维护者的解决方案跟踪我,打断我的腿。
有没有比创建具有 15 个参数的模板更好/更简洁的解决方案?
【问题讨论】:
-
通过阅读这个问题,我不知道您要实际做什么,也就是完成。诸如“有没有更好/更清洁的解决方案”之类的问题……除非您解释您要解决的 问题 是什么,否则提问没有意义。例如,使用生成的 IDL 不是问题。在预处理器中的标记上粘贴“Reader”是微不足道的,看起来您知道该怎么做。那你在做什么?
-
(...例如在 main 中,
obj这里有成员var1、var2等;类型为DataObject、DataObjectReader等;如果这是你'正在尝试做,obj的类型可以简单地是一个未命名的结构,还是一个std::tuple?) -
对象本身将由一个完全实现的类制成,该类包装了 OpenDDS 框架的功能。 问题是我想避免为 IDL 中定义的数百种数据类型输入样板代码,所以我想使用模板类。为了代码的可读性,我不想定义十几个模板参数。由于模板参数本身遵循固定模式,因此我只是在寻找一种简化的技巧来使用。这可能是一个无聊的问题,但仅此而已。
-
我收集到
FooReader等是由 IDL 工具生成的。我所追求的是(如果是这种情况)你想创建一个包含每个变体成员的对象。另外,你能用这个澄清来编辑这个问题吗? (这应该是问题的一部分;cmets 在 s.o. 上是不稳定的)
标签: c++ macros code-formatting