Мне трудно понять, как вернуть non-const
ссылка на элемент в std::vector
из метода константного класса. Простой пример того, что я собираюсь сделать, это
template<class T>
class MyClass
{
public:
MyClass : myVec(3)
{
}
T& x() const
{
return *(myVec.data())[0]
}
std::vector<T> myVec;
}
Поведение, за которое я иду, это то, что я хотел бы иметь возможность делать такие вещи, как следующие,
MyClass obj<double>;
obj.x() = 3.3;
assert(obj.x()==3.3)
собственный дает тот же тип поведения, но я не смог понять, как заставить его работать.
Вы могли бы использовать const_cast
, и он будет работать здесь (в соответствии с опубликованным использованием). Но вам это не понадобится для этого случая (и для большинства случаев).
Вы можете (и должны) добавить неконстантную перегрузку функции-члена для него. Затем функция-член const возвращает ссылку на const, функция-неконстантная функция возвращает ссылку на не-const. Соответствующий будет вызван через разрешение перегрузки.
const T& x() const
{
return myVec[0];
}
T& x()
{
return myVec[0];
}
Контейнеры стандартной библиотеки расширяют константу контейнера до самих значений. Так как ваш класс постоянен в x()
так же вектор. Вы могли бы использовать const_cast удалить const
от предмета в вашем аксессоре.
return const_cast <T&> (*(myVec.data())[0]);
В целом это считается плохой практикой, так как const
там, чтобы защитить вас. Обход этой защиты может усложнить работу кода.