2011-08-12 16 views
2

のMicrosoft Visual C++コンパイラは、プロパティ宣言の建設コンパイラの独立したC++プロパティ

__declspec(property(get=get_func_name, put=put_func_name)) 

は、Microsoft C++ __declspec(プロパティ(...))、または他の類似のコンパイラの独立したバージョンがありますか?いつものよう

+0

2秒Google検索では、これをもたらした:http://www.gamedev.net/topic/516976-__declspecproperty-support-in-gcc-4x-or-c0x/それは、あなたの質問に答えるのか? –

+1

テンプレートプログラミングを使ってプロパティを実装することができます:-) – Nawaz

+0

@Nawaz:それは、0以外のサイズのデータ​​メンバーを持つこと、つまりメモリ使用量の増加につながります。コンパイラレベルの実装には、この欠点がありません。別のポイントは、C++ではプロパティが実質的に役に立たないということです。 –

答えて

4

__が先行識別子は、コンパイラに予約されています。 C++ 03では__cpluscplus(C++とCを識別するため)、__FILE____LINE__があります。これらはすべてプリプロセッサエンティティです。

C++ 0xでは、セマンティクス値を持つ最初の単語である__attribute__という単語が導入されていますが、その違いはぼやけていますが、依然として探していることはしません。

EDIT:@Jamesのコメントにコメントする。

+0

の2番目の段落を参照してください。C++ 03には、いくつかの '__'識別子もあります:' __cplusplus'、 '__LINE__'などがありますが、もちろんそれら以外にもコンパイラ固有のものがあり、可能な限り避けるべきです。 –

0

いいえ。C++標準委員会にも同様のメカニズムが提案されましたが、いずれも受け入れられませんでした(Here is one such proposal from Borland)。

私は、テンプレートベースのおもちゃの実装を見てきましたが、彼らは実用的であるには余りにも不便になる傾向があり、大きな問題があること:ネストされたクラスのインスタンスは、囲むクラスのメンバー(ではないので

  • Javaの内部クラスインスタンスと同じように)、プロパティをその囲むクラスに明示的に「接続」する必要があり、宣言と初期化が面倒になります。

  • カッコなしで関数型エンティティを呼び出す方法はありません。したがって、変数にアクセスしているかのようにカスタムメイドプロパティを呼び出すことはできません。

+0

ボーランドの提案はこちら。私のgoogle-fuは働いています... http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1384.pdf – Roddy

+0

@Roddy:私は私の答えを訂正します、ありがとう。どのように私はそれを欠場することができたのだろうか... –

0

ニコラMusattiが言うように、Borland proposalは、Borland Delphiが重くプロパティを使用し、C++ Builderの(デルファイへのC++と同等 ')therefore requires it主な理由は、ありました。

C++ Builderでは、コードはこのように少し見えます。

__property __int64 Size = {read=GetSize, write=SetSize}; 
関連する問題