0

getter-setterのデフォルトの実装にテンプレートを使用することができます。

たとえば、http://www.kirit.com/C%2B%2B%20killed%20the%20get%20%26%20set%20accessors/A%20simple%20meta-accessor。最も重要なことは、このようなセッターまたはゲッターのデフォルトの動作をオーバーライドする場合、セッターゲッターの呼び出し構文はメソッドの呼び出しと同じであるため、「クライアント」コードを変更せずに簡単にこれを実行できることです。

an_object.an_int( 3 );
int i = an_object.an_int();

どちらの場合も、an_intはoperator()またはan_objectのメソッドを持つオブジェクトにすることができます。オーバーライドした後、「クライアント」コードで再コンパイルが必要になります。

しかし、プリプロセッサマクロなしでgetter-setterの「仮想」デフォルト実装を定義することは可能ですか?つまり、ここで重要なことは、オーバーライド中に「クライアント」コードを再コンパイルする必要がないということです。もちろん、プリプロセッサで行うことは可能ですが、もっとエレガントな解決策はありますか?

私のC++03の知識は不可能ですが、誰かがアイデアを持っているのでしょうか、それともC ++ 11で可能でしょうか?


「DavidRodríguez--dribeas」に対する回答:次のようなもの:

#define accessor(type,name) \
virtual type name() {return m_##name;} \
type m_##name;

「クライアント」コードを再コンパイルすることなく、派生クラスでオーバーライドできます。

4

2 に答える 2

0

関数がインラインでない限り、関数を再実装する場合はクライアントコードを再コンパイルする必要はありません。クライアントコードを新しい実装に再リンクする必要があります。

于 2012-03-14T19:01:10.160 に答える
0

一般的に有用な方法ではありません。非常に特殊なユースケースではほとんど機能する可能性があります。ただし、これらのワンオフをサポートするためのメンテナンスの負担は、努力する価値があることはめったにありません.

これを行うには、作成しているこの「フィールド」タイプに多くの複雑さを押し込みます。この複雑さはうまく一般化できません。アクセサーを自分で書くよりも簡単に使用できるとは限らない、非常に混乱するでしょう。

これらのアクセサーの作成に時間がかかる場合は、無料のヘルパー関数を作成して簡単にします。これらの自由関数は、1 つのことしか行わないため、具体的かつ直接的です。この方法で動作を収集することは、多少冗長であると認識されていても、はるかに柔軟で、時間の経過とともに保守しやすくなります。

これはまた、はるかに優れたカプセル化を備えています。本当に、あなたはインターフェースに大量の実装の詳細をダンプしていますが、それは面白くなく、そこにあるべきではありません.

于 2012-03-14T19:07:47.643 に答える