Saturday 15 August 2015

casting - C++: references for container elements -



casting - C++: references for container elements -

i seek write container-polynomial operator[] returning references , const references. when want utilize const operator[] within of reference, c++ chooses operator[] without const. should implement const operator[] private function , utilize in both places or there way create compiler utilize const-returning function?

template <typename t> class polynomial { std::vector<t> data; void deletetopzeroes () { int grade = grade (); while (degree && !data[degree]) { --degree; } data.resize (degree + 1); } public: polynomial (t constantterm) { data.resize (1); data[0] = constantterm; } int grade () const { homecoming 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 { homecoming grade <= grade () ? 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 { homecoming _polynomial[_degree]; // compiler uses "reference operator[] (size_type degree)" , stucks on recursion // there "const_reference operator[] (size_type degree) const" // seems more similar, isn't } }; reference operator[] (size_type degree) { homecoming reference (*this, degree); } };

try return static_cast<const polynomial&>(_polynomial)[_degree]; forcefulness compiler select const version.

ok cast utilize proving controversial, here approach without cast needed.

operator const t&() const { const polynomial& temp = _polynomial; homecoming temp[_degree]; }

c++ casting method-overloading

No comments:

Post a Comment