Как правило, вы не можете вызвать постоянную или неконстантную версию функции в зависимости от того, что вы делаете с возвращаемым значением. Если вы хотите эмулировать аналогичную функциональность, вы можете попробовать вернуть прокси-сервер, который переключит поведение в зависимости от того, что вы с ним делаете:
class Proxy
{
Matrix& m;
int x, y;
public:
...
// mutating operations
operator double&() { check(); return m.index(x,y); }
double& operator=(double d) { check(); return m.index(x,y)=d; }
// ... other mutating operations (+=, ...) analogously
// nonmutating ops
operator double() { return m.const_index(x, y); }
operator const double&() // ... same
};
Proxy Matrix::operator(int x, int y)
{
return Proxy(*this, x, y);
}
Предполагается, что check()
- это ваша проверка на законную мутацию (может быть интегрирована в index()
), а index()
и const_index()
- методы в Matrix, которые дают ссылку или постоянную ссылку на конкретное место.