2014-10-24 1 views
2
연산자 [] 는 참조를 반환하고 는 CONST를 참조하여 컨테이너 다항식을 작성하려고

. 그러나 const operator [] 참조를 사용하려면 C++은 연산자 []const없이 선택합니다. const operator []을 private 함수로 구현하고 두 위치 모두에서 사용해야합니까? 아니면 컴파일러가 const 반환 함수를 사용하도록 만드는 방법이 있습니까?C++ : 컨테이너 엘리먼트에 대한 참조는 I

template <typename T> 
class Polynomial { 
    std::vector<T> data; 

    void DeleteTopZeroes() { 
     int degree = Degree(); 
     while (degree && !data[degree]) { 
      --degree; 
     } 
     data.resize (degree + 1); 
    } 

public: 
    Polynomial (T constantTerm) { 
     data.resize (1); 
     data[0] = constantTerm; 
    } 
    int Degree() const { 
     return data.size() - 1 ? data.size() - 1: data[0] ? 0 : -1; 
    } 

    typedef size_t size_type; 
    typedef const T& const_reference; 

    const_reference operator[] (size_type degree) const { 
     return degree <= Degree() ? data[degree] : 0; 
    } 

    class reference { 
     Polynomial<T>& _polynomial; 
     int _degree; 

    public: 
     reference (Polynomial<T>& polynomial, size_type degree) 
      : _polynomial (polynomial) 
      , _degree (degree) 
     {} 
     reference operator= (const T& rhs) { 
      if (_degree <= _polynomial.Degree()) { 
       _polynomial.data[_degree] = rhs; 
       _polynomial.DeleteTopZeroes(); 
      } else if (rhs) { 
       _polynomial.data.resize (_degree + 1, 0); 
       _polynomial.data[_degree] = rhs; 
      } 
     } 
     operator const T&() const { 
      return _polynomial[_degree]; 
      // compiler uses "reference operator[] (size_type degree)" and stucks on recursion 
      // but there is "const_reference operator[] (size_type degree) const" 
      // which seems to be more similar, isn't it 
     } 
    }; 

    reference operator[] (size_type degree) { 
     return reference (*this, degree); 
    } 
}; 

답변

0

return static_cast<const Polynomial&>(_polynomial)[_degree];을 사용하여 컴파일러에서 const 버전을 선택하도록하십시오.

사용하려는 캐스트가 논란의 여지가 있음을 입증하므로 여기에 캐스트가 필요없는 접근 방식이 있습니다.

operator const T&() const { 
     const Polynomial& temp = _polynomial; 
     return temp[_degree]; 
    } 
+1

const를 추가하려면 'const_cast'가 바람직합니다. – Svalorzen

+1

왜? const_cast를 사용하면 위험한 캐스트를 만들 수 있습니다. 나는 static_cast가 더 안전하다고 생각한다. –

+0

const_cast는 constness를 추가하거나 제거하는 데 사용됩니다. 이것이 당신이 여기서하고있는 일이므로, 당신이 사용하게 될 것입니다. 나는 "위험"을 보지 못한다. – Svalorzen