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

时间:2010-08-11 04:19:17

标签: c++ macros

我有一个案例,我正在使用宏来生成简单的子类。我现在把它定义为:

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

我真的希望Name包含一个句点,但是宏会扩展到此并且不起作用:

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

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

班级名称无关紧要(只要它是唯一的)。唯一重要的是可读字符串。

我可以访问Boost.Preprocessor,但我无法理解是否有任何对此有用。

感谢。

编辑:背后的原因是我将Industrial Strength Pluggable Factories作为模板和宏来实现,以便轻松生成制造商类。可能有很多制造商ID,所以我希望能够通过使用点来“命名”它们。我现在正在用下划线做这件事,我只是好奇我是否可以使用点而不是因为我发现它在视觉上更令人愉悦。唯一重要的部分是因为除了我之外的另一个人正在编写代码时看不到宏生成的代码,宏不能在幕后做任何阴险的事情。因此,无论输入什么字符串,因为名称必须是用于检索项目的密钥。

今天早上我重新审视了这个问题,我想我可以一起避免使用宏。不管怎样,谢谢。

4 个答案:

答案 0 :(得分:2)

为什么不改为创建一个在.h文件中生成classe声明的小型独立程序?这样你就不需要操纵宏并拥有更多的控制权。

答案 1 :(得分:2)

我不认为你可以将参数NAME全部设为主,除了将它与另一个字符串连接起来。因此,明显的解决方案是不使用包含点的字符串 REGISTER(whateverType, SomethingwithoutDot)

我知道它没有回答你的问题,但在我看来你应该看一下你试图用这个宏解决的问题,并且可能找到解决这个问题的另一种方法。我认为它会更有效率

答案 2 :(得分:1)

可能不是你想要的,但为什么不在宏中添加额外的参数?

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

REGISTER(SomeType, Simple, Simple.Class);

答案 3 :(得分:0)

不是你的答案,而是一种解决方法。如果您对课程名称SimpleClass而不是SimpleClassClass感到满意,那么这应该有效:

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