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);
}
};
const를 추가하려면 'const_cast'가 바람직합니다. – Svalorzen
왜? const_cast를 사용하면 위험한 캐스트를 만들 수 있습니다. 나는 static_cast가 더 안전하다고 생각한다. –
const_cast는 constness를 추가하거나 제거하는 데 사용됩니다. 이것이 당신이 여기서하고있는 일이므로, 당신이 사용하게 될 것입니다. 나는 "위험"을 보지 못한다. – Svalorzen