2011-02-09 4 views

답변

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 할 수 있으면 좋겠어. ! –

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 
} 

내가 좋아하는 것 형성 코드, 그냥 그림. 그것은 테스트되지 않았습니다.

편집 : 너무 빨리 나를위한 예레미야 !!!

관련 문제