русский
Germany.ruForen → Архив Досок→ Programmierung

[C++] Два разных string-класса

106  
Simple Nothing is f*cked25.09.06 09:43
Simple
NEW 25.09.06 09:43 
Проблема в следующем: в системе используется свой собственный string-класс. Внешняя библиотека требует c-ctring или std::string. К сожалению, внутренний класс не дает ни того, ни другого: нужно явно преобразовывать. А хочется на лету и без геморроя. Что делать? (с)
Первое, что приходит на ум, написать класс, который поддерживает оба интерфейса.
#1 
Murr коренной житель25.09.06 12:41
Murr
NEW 25.09.06 12:41 
in Antwort Simple 25.09.06 09:43
Там вроде автокастинга все одно не будет - нет смысла писать третий класс.
Наверное надо дорабатывать, если это возможно, самописный класс и выкидывать стандартный.
Доработка будет не сложной - стринговый код, даже две версии, я сюда кидал...
#2 
Simple Nothing is f*cked25.09.06 12:49
Simple
NEW 25.09.06 12:49 
in Antwort Murr 25.09.06 12:41
Про operator <typename> никогда не слыхал? ;)
#3 
Murr коренной житель25.09.06 13:01
Murr
25.09.06 13:01 
in Antwort Simple 25.09.06 12:49, Zuletzt geändert 25.09.06 13:02 (Murr)
Я написал автокастинга - т.е. автоматического, без переработки кода, кастинга.
При переработке - без разницы что делать... но возможно проще написать заново.
#4 
  scorpi_ скептик25.09.06 13:51
NEW 25.09.06 13:51 
in Antwort Simple 25.09.06 09:43
IMHO, если нельзя дописать внешнему стринг-классу необходимые операторы, то остаются две возможности: либо прилепить всем классам возвращающим нестандартный стринг адапторы, или же (если их дофига), прилепить декоратор к стринг-классу. Типа так:
В ответ на:
#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.
#5 
Simple Nothing is f*cked25.09.06 14:20
Simple
NEW 25.09.06 14:20 
in Antwort scorpi_ 25.09.06 13:51
А почему бы не дать декоратору оба интерфейса и работать только с ним?
#6 
Simple Nothing is f*cked25.09.06 14:21
Simple
NEW 25.09.06 14:21 
in Antwort Murr 25.09.06 13:01
Кто ж этим заниматься будет, дружище? Чай не в опенсорсе работаю :)
#7 
  scorpi_ скептик25.09.06 14:30
NEW 25.09.06 14:30 
in Antwort Simple 25.09.06 14:20
Что занчит оба интерфейса?
#8 
Simple Nothing is f*cked25.09.06 14:38
Simple
NEW 25.09.06 14:38 
in Antwort scorpi_ 25.09.06 14:30
У тебя в примере уже есть operator const char*, это примерно то, что я имел в виду. Прозевал.
#9