2016-08-11 26 views
3

我知道最好避免C++中的宏。使用內聯函數替換類似函數的宏,並使用constexpr/using來替換const-variable-define宏。 但我想知道是否有一種方法可以通過一些現代C++技術來替代宏串聯功能。用現代C++技術替換C++宏的連接

例如,如何更換以下宏:

#define GETTER_AND_SETTER(name)  \ 
    inline void Set##name(int value) \ 
    {        \ 
     m_##name = value;    \ 
    } 
    inline int Get##name() const  \ 
    {        \ 
     return m_##name;    \ 
    } 

然後在一類,我可以一個很大的變數,這使得代碼更乾淨做到這一點。

GETTER_AND_SETTER(Variable1) 
GETTER_AND_SETTER(Variable2) 
GETTER_AND_SETTER(Variable3) 
... 

我已經檢查herehere,但我沒有得到答案。那麼對此有何想法? 謝謝。

編輯: getters/setters的例子只是用來顯示想法。請不要關注他們。 :)

+0

不,沒有辦法:) – wasthishelpful

+5

你的問題是你把你的班級當作需要獲取者和設置者的數據叢。 – StoryTeller

+1

只有使用宏才能創建新的標識符。 – Quentin

回答

7

你不能。

在編譯時你可以使用變量名執行任何操作; C++根本沒有任何反射功能。你只能用生成的代碼,使用預處理器來做魔術。

典型的變通辦法涉及到std::map s的「名稱」的值,但你現有的方法似乎對我來說很合理,除非你有一大堆的東西。

雖然根據您的要求,您最好還是不要忘記這個「getter」/「setter」廢話,而只是爲您的班級定義一些邏輯的,語義的成員函數。如果你真的只是爲每個成員變量創建一個直接訪問器和增變器,那麼,真的,what's the point

+0

其中一個要點可能是找到所有正確讀取或準確寫入數據成員的代碼。 (如果你只是直接讀寫它,你只能找到它被訪問的地方。)雖然這可以訪問私有數據,但這對類自己的方法沒有幫助。這也暗示了班級只是一個改進的POD的東西。 – Ruslan

+0

@Ruslan:也許,但是如果你有超過一兩個代碼寫入同一個對象,那麼你的程序寫得很糟糕,而且你沒有足夠的'const'。所以這有點成爲一個有爭議的問題。 –

+0

謝謝你的回答。這只是一個展示這個想法的例子。 :) – houghstc