2011-02-09 10 views
4

D Programming Language Version 2nifty method to overload an expression like thisがありますC++ではopIndexAssignが可能ですか?

classInstance[someName] = someValue; 

それともthis little exampleで定義されたD機能など:

ref Map opIndexAssign(ref const(ValueT) value, ref const(NameT) name) 
{ 
    this.insert(name, value); 
    return this; 
} 

は(理想的にSTLを使用せずに)C++で可能これですか?もしそうなら、どうですか?

答えて

8

通常、戻り値のタイプはoperator[]です。そのオブジェクトにはカスタムoperator=が定義されます。 vector<bool> C++標準ライブラリの特殊化は、プロキシを使用して、探している動作を取得します。しかし、プロキシベースのソリューションはDバージョンほど透過的ではありません。コードが何かのようである:

class proxy; 

class my_map { 
    public: 
    proxy operator[](const key_type& k); 
    // Rest of class 
}; 

class proxy { 
    my_map& m; 
    key_type k; 
    friend class my_map; 
    proxy(my_map& m, const key_type& k): m(m), k(k) {} 

    public: 
    operator value_type() const {return m.read(k);} 
    proxy& operator=(const value_type& v) {m.write(k, v); return *this;} 
}; 

proxy my_map::operator[](const key_type& k) { 
    return proxy(*this, k); 
} 
+0

ありがとう、それはトリックでした。私は実際に(ほとんど)完全にDコードの構文を模倣することができましたが、このコードはイテレータの乱用を使用していますが(主にちょうどそれがどのように行われているかを示すためです):http://codepad.org/YK6uDHDq - 私はupvoteを2回! –

3

がDに精通していない、私はあなたの最初のコードスニペットはvalue = someValuename = someNameopIndexAssignを呼び出して終了することを前提とする必要がありますするつもりですか?

もしそうなら、それはC++で行うことができますが、そう簡単な方法ではできません。あなたは[]演算子をオーバーロードし、次のようにカスタム=演算子(非常に基本的な、不自然な例)でプロキシオブジェクトを返すことができます:強く前述/ウェル非常にきれいではないことを強調し

class MyProxy 
{ 
    public: 
     MyProxy (int& ref) : valueRef(ref) { } 
     MyProxy& operator = (int value) { valueRef = value; return *this; } 
    private: 
     int& valueRef; 
}; 

class MyClass 
{ 
    public: 
     MyProxy operator [] (std::string name); 
    private: 
     int myVal; 
}; 

MyProxy& MyClass::operator [] (std::string name) 
{ 
    if (name.compare("myVal")) 
     return MyProxy(myVal); 

    ... 
} 

int main () 
{ 
    MyClass mc; 

    mc["myVal"] = 10; // Sets mc.myVal to 10 
} 

は私がしたいです形成されたコード、ちょうどイラスト。それはテストされていません。

EDIT: Jeremiah !!!

関連する問題