6

次のようないくつかのプロパティを定義したいと思います。

#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 ではなく、getCount/setCount と呼ばれるメソッドが欲しいです。

4

2 に答える 2

7

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

したがって、最初のコメントで@Shahbazが言ったことに従うか、このようなことをして、getとset ofget_countset_countformを提供します。

#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;
}

ideone での簡単なデモ

変数はprivateセクションで宣言され、その名前はm_countであり、関数はセクションで (宣言されているだけでなく)定義されていることに注意してください。public

または、マクロのCount代わりに次のように渡すこともできます。count

 property(int, Count);

これを行うと、変数 asm_Countおよび関数 asgetCountおよびを作成できますsetCount。それはあなたが望むものに最も近いです。

于 2012-04-19T14:43:39.290 に答える
3

(私が知っている)Cプリプロセッサを使用してこれを行う方法はありません。get_count()妥協案として、アンダースコアを使用して、読みやすいものを使用することをお勧めします。その他の選択肢:

  • 本当にプリプロセッサを使い続けたい場合はm4、最初のステップとして使用して調査することができます。m4私は非常に似たようなことをしたので、それは間違いなく可能です。とはいえ、これはあなたが達成したいことには少し複雑に思えます。
  • #define property(T, x, name)名前を個別に指定できるように、パラメーターを追加します。それはより柔軟ですが、おそらくあなたが望むものではありません。
  • アクセサー/ミューテーターを作成するだけの作業である場合は、それを実行するIDEとコードジェネレーターがたくさんあります。または、シェル/ Python / Perlを記述して、これを1つとして簡単にノックアウトすることもできます。

最後の2つの所見:このように書く方が効率的だと思われるかもしれませんが、コードを管理している人は誰でも検索を行っsetCount()ても見つからない可能性があり、あなたが行ったことを理解するまで時間が無駄になることを忘れないでください。つまり、コード保守の観点から、シンプルに保ちます。次に、マクロは大文字で簡単に識別できるため、大文字で表すことをお勧めします。繰り返しますが、これはコードを保守しているときに本当に役立ちます。

于 2012-04-19T14:42:39.303 に答える