Как запретить оператор записи [] шаблонного класса, если шаблонный параметр равен 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[] будет возвращать левую ссылку на константное значение.

→ Ссылка