Login
[C++] Два разных string-класса
106
NEW 25.09.06 09:43
Проблема в следующем: в системе используется свой собственный string-класс. Внешняя библиотека требует c-ctring или std::string. К сожалению, внутренний класс не дает ни того, ни другого: нужно явно преобразовывать. А хочется на лету и без геморроя. Что делать? (с)
Первое, что приходит на ум, написать класс, который поддерживает оба интерфейса.
Первое, что приходит на ум, написать класс, который поддерживает оба интерфейса.
NEW 25.09.06 12:41
in Antwort Simple 25.09.06 09:43
Там вроде автокастинга все одно не будет - нет смысла писать третий класс.
Наверное надо дорабатывать, если это возможно, самописный класс и выкидывать стандартный.
Доработка будет не сложной - стринговый код, даже две версии, я сюда кидал...
Наверное надо дорабатывать, если это возможно, самописный класс и выкидывать стандартный.
Доработка будет не сложной - стринговый код, даже две версии, я сюда кидал...
NEW 25.09.06 13:01
in Antwort Simple 25.09.06 12:49, Zuletzt geändert 25.09.06 13:02 (Murr)
Я написал автокастинга - т.е. автоматического, без переработки кода, кастинга.
При переработке - без разницы что делать... но возможно проще написать заново.
При переработке - без разницы что делать... но возможно проще написать заново.

NEW 25.09.06 13:51
in Antwort Simple 25.09.06 09:43
IMHO, если нельзя дописать внешнему стринг-классу необходимые операторы, то остаются две возможности: либо прилепить всем классам возвращающим нестандартный стринг адапторы, или же (если их дофига), прилепить декоратор к стринг-классу. Типа так:
То бишь мы используем CustomStringDecorator в своих интерфейсах на границе систем, а в своей системе можем работать с std::string.
В ответ на:
#include <string>
#include <iostream>
class CustomString
{
std::string data_;
public:
CustomString() : data_("test string" ){};
const char* data() const { return data_.c_str(); }
};
class External
{
CustomString s_;
public:
const CustomString some_interface() const { return s_; }
};
class CustomStringDecorator : public CustomString
{
public:
CustomStringDecorator( const CustomString& cs ) : CustomString( cs ) {}
operator const std::string() const { return std::string( data() ); }
operator const char*() const { return data(); }
};
class Internal
{
public:
void some_interface( const CustomStringDecorator& csd )
{
std::cout << csd << std::endl;
}
};
int main()
{
External ex;
Internal in;
in.some_interface( ex.some_interface() );
}
То бишь мы используем CustomStringDecorator в своих интерфейсах на границе систем, а в своей системе можем работать с std::string.
NEW 25.09.06 14:20
in Antwort scorpi_ 25.09.06 13:51
А почему бы не дать декоратору оба интерфейса и работать только с ним?
NEW 25.09.06 14:21
in Antwort Murr 25.09.06 13:01
Кто ж этим заниматься будет, дружище? Чай не в опенсорсе работаю :)
25.09.06 14:38
in Antwort scorpi_ 25.09.06 14:30
У тебя в примере уже есть operator const char*, это примерно то, что я имел в виду. Прозевал.