2010-08-11 73 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);