Я хотел бы создать оболочку с одним присваиванием для базовых типов (например, int), которая говорит как int, идет как int, пахнет как int, но может быть только изменен или назначен не более одного раза (например, на некоторых чистых функциональных языках). Например (конструктор копирования опущен, чтобы простой пример):Одиночное назначение для базовых типов в C++
template<class T>
struct SA {
SA<T>(T init) : wasAssigned(false) {
val = tmp = init;
}
SA<T> & operator=(const T& other) {
if (!wasAssigned) {
if (val != tmp) {
val = tmp;
} else {
val = tmp = other;
}
wasAssigned = true;
}
return *this;
}
operator T&() {
if (!wasAssigned && (val != tmp)) {
wasAssigned = true;
val = tmp;
} else {
tmp = val;
}
return tmp;
}
private:
bool wasAssigned;
T val, tmp;
};
Это близко, но не идеально. Он основан на тест равенства Val/TMP для обнаружения изменений, и не в этом случае:
SA<int> i(3);
cin >> i;
i = 5;
Ифф в cin >> i
присваивает такое же значение в качестве начального значения (3), я буду 5 в конце. Как это можно зафиксировать?
Прошу прощения за вычеркивание очевидного вопроса, но я не могу остановить себя: зачем это нужно? – sbi
Предположим, вы хотите, чтобы значение изменялось только первым вызовом RPC или позволяло пользователю изменять значение только в том случае, если оно не было заблокировано с помощью аргумента командной строки и т. Д. Очевидно, что есть способы сделать это без Single Назначение. Я хочу знать, может ли концепция быть обобщенной. –