Как запретить оператор записи [] шаблонного класса, если шаблонный параметр равен false?
Есть шаблонный класс реализующий оператор []. Одним из параметров шаблона хочу задавать разрешение на запись через оператор [] если параметр шаблона равен true. А оператор чтения сохранить. Понятно, что можно взять указатель при чтении, но это уже грязный хак от пользователя класса, и там уж он сам решает.
Как это можно реализовать?
Готов рассмотреть другие варианты
Ответы (1 шт):
Автор решения: sibedir
→ Ссылка
Можно менять возвращаемый тип оператора []
в зависимости от условия
#include <iostream>
#include <type_traits>
template <bool ReadOnly = false>
class MyClass {
private:
int data[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
public:
int const& operator[](size_t idx) const {
return data[idx];
};
std::conditional_t<ReadOnly, int const&, int&> operator[](size_t idx) {
return data[idx];
};
};
int main()
{
MyClass rw;
std::cout << rw[5] << "\n";
rw[5] = 10;
std::cout << rw[5] << "\n";
MyClass<true> ro;
std::cout << ro[5] << "\n";
ro[5] = 10; // error
std::cout << ro[5] << "\n";
}
Т.е. в случае, если наш тип readonly, то operator[]
будет возвращать левую ссылку на константное значение.