在宏中拆分字符串

Posted

技术标签:

【中文标题】在宏中拆分字符串【英文标题】:Split string in macro 【发布时间】:2015-06-16 12:22:34 【问题描述】:

我有一个类名及其命名空间,例如 BasicType::MyType

是否可以创建一个宏来拆分名称并仅使用范围运算符之后的部分(我想在没有第一部分的宏中创建MyType 对象)?

编辑:

我在命名空间BasicType 中使用具有不同类的库:

BasicType::ClassA
BasicType::ClassB
...

为了使用这些类,我需要注册它们。我必须将它们注册到另一个类,它想要类的名称,没有命名空间:

BasicType::ClassA classa;
masterClass.register("ClassA", classa);

为了在模板中使用它们(因为我必须使用这个命名空间的许多类),我正在创建一个特征,使用宏自动化(因为 ClassA 我也有 ClassAImplClassATypeSupport等):

#define BASICTYPE_TRAITS(className) \
  template <> \
  struct DDSTraits<className> \
   \
    using TypeSupportImpl = className##Impl; \
    using TypeSupport_var = className##TypeSupport; \
  ;

template <typename T>
struct BASICTYPE_TRAITS


;
....
BASICTYPE_TRAITS(BasicType::ClassA) // after this I've my trait

现在我想在这个特征中添加一个带有类名的字符串,这样我就可以用它在masterClass中注册类

【问题讨论】:

为什么需要它?这似乎是一个 XY 问题。 我已经编辑了帖子。 为什么不接受宏的两个参数:命名空间名和类名? BASICTYPE_TRAITS(BasicType, ClassA) 好吧,我很愚蠢(我可以说累了,但事实并非如此......)。请说它作为答案,以便我接受。谢谢 你也可以在本地 use namespace BasicType 避免指定命名空间 【参考方案1】:

你可以改变你的宏,让它接受两个参数:命名空间名和类名。类似的东西

#define BASICTYPE_TRAITS(namespaceName, className) \
  template <> \
  struct DDSTraits<namespaceName::className> \
   \
    using TypeSupportImpl = namespaceName::className##Impl; \
    using TypeSupport_var = namespaceName::className##TypeSupport; \
  ;

template <typename T>
struct BASICTYPE_TRAITS


;
....
BASICTYPE_TRAITS(BasicType, ClassA) // after this I've my trait

【讨论】:

以上是关于在宏中拆分字符串的主要内容,如果未能解决你的问题,请参考以下文章

在宏中调用函数

确保每个字符串文字都包含在宏中

如何在宏中获取Scala-macro-annotated类或对象的扩展类路径?

在宏内取消字符串化

Symfony 3在宏中使用宏?

如何在宏中调用自身的方法?