Пытаясь подвести итоги всех обсуждений, похоже, что вы никогда не найдете подходящего решения, потому что ... ваши требования находятся в предубеждении.
- Вы хотите, чтобы ваш класс вел себя как ats:: string
- std :: string ведет себя как значение, но
- значение не «изменяется» при доступе, но (подумайте, c = a + b: ожидаете ли вы изменения a и bих значение ??) ...
- при доступе к вашему "значению" вы хотите изменить его.
Если что-то я подвел, собирая все миры (предложение: отредактируйте свой вопросв противном случае все отвечающие рискуют быть потерянными) правильно, у вас проблемы с 3 и 4 (обратите внимание, что 3. происходит от понятия «назначение», и вы можете не замечать его, в то время как 4. приходит от вас напрямую).)
Теперь я могу попытаться перепроектировать вашу психологию (потому что вы не предоставили хорошую информацию о том, что представляет ваш класс и почему вы не можете «расширить» строку), я не могу найти две возможности, ни одну из которыхбудет соответствовать всемвышеуказанные требования.
Сохраните строку в своем классе и заставьте ваш класс вести себя как std :: string.Есть три способа прийти к этой точке:
a.вставьте строку и заставьте ваш класс распадаться на нее: по сути, ваш класс должен содержать
.
operator std::string&() { return my_string; } //will allow l-value assignments
operator const std::string&() const { return my_string; } //will allow r-value usage
const char* c_str() const { return my_string.c_str(); }
b.происходит от std :: string.Фактически это похоже на наличие анонимной строки my_string, которая подразумевает «распад» операций.Не так, как указано выше.
c.Внедрить или получить в частном порядке, и переписать интерфейс std :: string, делегируя функции std :: string.Это просто долгий набор текста, чтобы получить именно b.результат.так что, черт возьми?(этот последний вопрос посвящен всем тем, кто считает, что a или b нарушат инкапсуляцию. c также нарушит его, это займет больше времени!)
- Не хранитьСтрока, но просто получите ее в результате вычисления («поиска», о котором вы говорите, не уточняя, что это такое).
В этом последнем случае вам нужен класс с затуханиемавтоматически в std :: string как значение.Поэтому в вашем классе
operator std::string() const { return your_lookup_here; }
необходимо отметить, что const необходим, но нет необходимости изменять внутреннее состояние вашего класса, поскольку результирующая строка не сохраняется.
Но этопоследнее решение имеет проблему с const char *: поскольку строка является временной, пока вы ее не назначите, ее буфер также является временным (будет уничтожен), поэтому распад на const char * для назначения указателя не имеет смысла (указательбудет указывать на мертвый буфер).У вас может быть
const char* c_str() const { return std::string(*this).c_str(); } //will call the previous one
, но вы можете использовать его только в выражениях или сквозном параметре в вызовах функций (так как временное будет существовать, пока вычисляющее выражение не будет полностью оценено), а не в присваиваниизначение l (например, const char* p; p = myclassinstace.c_str();
)
Во всех вышеперечисленных случаях (все 1.) вам также необходимо:
myclass() {}
myclass(const std::string& s) :my_string(s) { ... }
myclass(const char* s) :my_string(s) { ... }
или - в C ++ 11 просто
template<class ...Args>
myclass(Args&&... args) :my_string(std::forward<Args...>(args...)) {}
В случае 2. вместо инициализации несуществующего my_sting, вы должны использовать аргументы, чтобы установить, что вы будете искать (мы не знаем, что это такое, так как вы не сказали нам)
Надеюсь, что во всех этих опциях вы найдете что-то полезное.