代码之家  ›  专栏  ›  技术社区  ›  Jonathan Sternberg

使用C++宏查找/替换?

  •  1
  • Jonathan Sternberg  · 技术社区  · 14 年前

    #define REGISTER( TYPE, NAME )                     \
        struct NAME ## Class : public ParentClass      \
        {                                              \
            NAME ## Class () : ParentClass ( # NAME ); \
        }
    

    我确实希望名称中包含句点,但宏会扩展到此位置,因此无法工作:

    struct Simple.ClassClass : public ParentClass
    {
        Simple.ClassClass () : ParentClass ("Simple.Class");
    };
    

    是否仍然需要使用预处理器定义来除去名称中的句点?然后我可以在字符串中保留句点(根据需要),并让类名使用不同的(合法)字符。

    类名并不重要(只要它是唯一的)。唯一重要的是可读字符串。

    谢谢。

    编辑:这背后的原因是我正在实现 Industrial Strength Pluggable Factories

    今天早上我重新研究了这个问题,我想我可以一起避开宏。无论如何谢谢你。

    4 回复  |  直到 14 年前
        1
  •  2
  •   user376591 user376591    14 年前

    我认为除了用另一个字符串连接它之外,你不能完整地维护参数名。所以obivous的解决方案是不使用包含点的字符串。
    REGISTER(whateverType, SomethingwithoutDot)

        2
  •  2
  •   AndersK    14 年前

        3
  •  1
  •   Remy Lebeau    14 年前

    可能不是您想要的,但是为什么不直接在宏中添加一个额外的参数呢?

    #define REGISTER( TYPE, PREFIX, NAME )               \ 
        struct PREFIX ## Class : public ParentClass      \ 
        {                                                \ 
            PREFIX ## Class () : ParentClass ( # NAME ); \ 
        } 
    
    REGISTER(SomeType, Simple, Simple.Class);
    
        4
  •  0
  •   Donotalo    14 年前

    SimpleClass 而不是 SimpleClassClass

    #define REGISTER( TYPE, NAME )                     \
    struct NAME ## Class : public ParentClass      \
    {                                              \
        NAME ## Class () : ParentClass ( # NAME ".Class" ){} \
    }