2010-08-11 66 views
1

我有一个情况,我正在使用一个宏来生成简单的子类。我目前得到它定义为:使用C++宏查找/替换?

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

我真正想要的名称包含一个句点,但随后的宏被扩展到这一点,并不起作用:

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

反正是有使用预处理器定义来摆脱名称中的时间段?然后,我可以在字符串中保留句点(根据需要)并使类名使用不同的(合法)字符。

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

我有机会获得Boost.Preprocessor,但我不明白,如果任何,这将是对这项有益的。

谢谢。

编辑:这背后的原因是我实现Industrial Strength Pluggable Factories作为模板,并很容易地生成制造商类的宏。虽然可能有很多制造商ID,所以我希望能够使用点“命名空间”。我现在正在使用下划线,我只是好奇,如果我可以用点来代替它,因为我觉得它在视觉上更令人愉悦。唯一重要的部分是,由于除我以外的另一个编写代码的人不会看到宏所产生的代码,所以宏不能在幕后做任何阴险的事情。所以无论什么字符串都被放入,因为名称必须是用于检索项目的键。

我的问题,今天上午relooked,我想我可以避开宏一起。不管怎么说,还是要谢谢你。

+0

什么是'(简单)(类)'类型的东西?我不认为你可以轻松管理点名 – Anycorn 2010-08-11 04:23:40

+0

@ Jonathan Sternberg,背后的理由是什么?你为什么想要这样做(宏观)? – liaK 2010-08-11 05:26:13

+0

会下划线而不是周期? – greatwolf 2010-08-11 05:33:22

回答

2

我不认为你可以mainipulate参数名称ATT所有,用另一个字符串旁边拼接它。因此,明智的解决方案是使用包含点的字符串。
REGISTER(whateverType, SomethingwithoutDot)

我知道它不回答你的问题,但在我看来,你应该在你尝试用这个宏来解决,也许找到另一种方式解决这个问题,而不是这个问题一起来看看。我认为它会更有效率

+0

+1为“尝试另一种方式”。 – 2010-08-11 13:17:51

2

你为什么不改为创建在.h文件中生成CLASSE声明一个独立的小程序?这样你就不需要摆弄宏指令了,并且拥有更多的控制权。

+0

不要给海报思路。这几乎不是一个好主意。 手动编写代码并避免errorprone代码。 – 2010-08-11 06:39:42

+0

@nebu我希望“手动编写代码”和“避免errorprone代码”是互斥的:-) – 2010-08-11 07:55:20

0

不是你的答案,而是一种解决方法。如果你很高兴与类名SimpleClass而不是SimpleClassClass,那么这应该工作:

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

可能不是你在找什么,但为什么不只是增加一个额外的参数给宏?

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

REGISTER(SomeType, Simple, Simple.Class);