2012-03-06 11 views
2

C++で非クラス型の演算子[]をオーバーロードする方法があるのだろうかと思います。非クラス型のオーバーロード演算子[]

基本的には、ポインタ(CoreFoundationのCFDictionaryRef)であるデータ型があります。しかし、それはクラスではありません(特定のクラスに対して演算子[]のオーバーロードが許可されていることがわかります)。私はCFDictionaryRef内の各要素にアクセスする方法を知っています(CFDictionaryGetIndex(CFIndexインデックス)を使用するなど)。私はそれを単純化して、毎回その関数呼び出しを書く必要がないようにしたい。 CFDictionaryRefの演算子[]をオーバーロードしたいです。しかし、それはクラスではないので、私が見ているから、それは不可能です。

誰もが何か提案がありますか?

答えて

3

あなたはそうですが、非ユーザ定義型の演算子をオーバーロードすることはできません。

あなたは、クラスにポインタをラップして、クラス自体に演算子をオーバーロードすることができます。あなたはクラス型の演算子をオーバーロードすることしかできないので、これは唯一のオプションです。

class CFDictionaryRefWrapper { 
public: 
    CFDictionaryRefWrapper(CFDictionaryRef r) : dref(r) { } 

    CFDictionaryRef dref; 

    Type operator[](unsigned int index) { 
     /* do whatever with dref */ 
    } 
}; 

これには、必要な場合にポインタ(RAII)の有効期間を自動的に管理できるという利点もあります。

+0

ええ、私はラッパーに入れてくれると思います –

1

いいえ、[]演算子にポインタ型または他の組み込み型をオーバーロードすることはできません。実際には、ptr[N]はすでに*(ptr + N)の略です。

[]演算子をオーバーロードする場合は、ポインタをラップする独自のクラスを定義する必要があります。

+0

@Benjamin、はい、ありがとう –

関連する問題