2012-04-19 2 views
5

は、私のようないくつかのプロパティを定義したいと思います:大文字(X>のgetX/SETX)

#define property(T, x) T x; T get ## x(); void set ## x (T value); 

class foo { 
public: 
    property(int, count); 
    property(float, size); 
} 

を、私は同様にgetCount/setCountと呼ばれる方法が好きで/ setcountをGETCOUNTないでしょう。

+2

これはできません。重複を最小限に抑えるために 'property(int、count、Count)'(または 'property(int、c、C、ount)')マクロを変更することができます(do not、それは冗談でした)) – Shahbaz

+1

isn 'Java。受け入れられたC++スタイルでは、関数は 'get_x()'と 'set_x()'という名前にする必要があります(長さやカウントの名前は 'size()'と 'resize()')。 –

+3

あなたのマクロが示唆しているように、あなたの変数が公開されている場合、なぜアクセサに気をつけますか? – Nick

答えて

3

Cプリプロセッサを使ってこれを行う方法はありません。私は妥協案として提案したい、あなたはアンダースコアのために行くと簡単に読むget_count()を使用してください。その他の代替方法:

  • 実際にプリプロセッサを使用したい場合は、m4を最初の手順として使用して調査できます。 m4で私は非常に似たようなことをやってきたことは間違いありません。これは、あなたが達成したいと思うものにとっては少し複雑に思えます。
  • 余分なパラメータを追加すると、#define property(T, x, name)となり、名前を別々に指定することができます。それはより柔軟ですが、おそらくあなたが望むものではありません。
  • アクセッサ/ミューテータを作成するだけの足跡がある場合は、多くのIDEとコードジェネレータがあなたのためにやってくれますし、シェル/ Python/Perlを書いて非常に簡単に解くことができます。

二つの最終所見:それはこのようにそれを書くために、より効率的に思えるかもしれませんが、あなたのコードを維持し、誰もがうまくsetCount()の検索を行うことができますことを覚えておいてくださいと彼らはパズルまでの時間を無駄にそれを見つけることができません何」やったよ。私。コードの保守の視点から、は簡単にしてください。第2に、マクロを大文字で表すことは、そのマクロを大文字で簡単に識別できるので、大文字で表すことをお勧めします。もう一度これはコードを維持しているときに本当に役立ちます。

5

コメントで言うとおり、あなたはそれをすることはできません。プリプロセッサはそのようなことをしません。

@Shahbazが最初のコメントで言ったことに従うか、get_countset_countという形式を取得して設定するようなことをしてください。変数がprivateセクションで宣言され、その名前がm_countであり、そして機能が定義(だけでなく、を宣言)publicセクションであることを

#define property(T, x) private : T m_## x; \ 
public : T get_## x() { return m_## x;} \ 
void set_## x (T value) { m_## x = value; } 

class foo { 
public: 
    property(int, count); 
    property(float, size); 
}; 

int main() { 
     foo f; 
     f.set_count(10); 
     std::cout << f.get_count() << std::endl; 
     return 0; 
} 

Quick demo at ideone

注意。

または、としてマクロにCount代わりのcountを渡すことができます。あなたはそう、あなたはgetCountsetCountとしてm_Countとして変数や関数を作成することができない場合

property(int, Count); 

。それはあなたが望むものに最も近いものです。