обработка ошибок — расширение конструктора c ++ / typedef

Расширение конструктора C ++ в Borland C ++ Builder.

У меня есть код, который объединяет UnicodeString значения (ранее AnsiString).

UnicodeString string="test1";
Variant v1="test";
string = string + UnicodeString(v1);
[bcc32 Ошибка] myTest.cpp (154): E2015 Неоднозначность между
‘System :: UnicodeString :: UnicodeString (const System :: UnicodeString &) в c: \ program files (x86) \ embarcadero \ studio \ 17.0 \ include \ windows \ rtl \ ustring.h: 86 ‘и
‘System :: UnicodeString :: UnicodeString (const wchar_t *) в c: \ program files (x86) \ embarcadero \ studio \ 17.0 \ include \ windows \ rtl \ ustring.h: 89’

Теперь проблема в том, что Variant неоднозначно, и компилятор жалуется на эту неоднозначность (достаточно справедливо).

Если я добавлю прямое приведение к stringработает нормально.

string = string + UnicodeString(v1.As<UnicodeString>());

Проблема в том, что мой код огромен, и таких штук тысячи. Я хотел бы представить новый явный typedef или макрос, который делает это:

Данный аргумент v1 Variantон выполняет вместо этого:

UnicodeString(v1)

Это выполняет это вместо этого:

UnicodeString(v1.As<UnicodeString>())

Я понимаю, что это может быть достигнуто путем расширения каким-либо образом (не уверен, как) конструктор или typedef UnicodeString добавляя UnicodeString(Variant)
(или макрос?).

PS. UnicodeString это системный класс, поэтому я не могу изменить его напрямую.

PS1. Та же самая проблема (даже больше частей кода) с AnsiString, Создание функции не работает :(. Для AnsiString это не работает :(.

Значение AnsiString в системном заголовке (sysmac.h):

typedef AnsiStringT<0> AnsiString;

Пример:

AnsiString myTest::AnsiString(Variant v)
{
return "";
}
[bcc32 Ошибка] .cpp (122): E2235 Должна быть вызвана функция-член или взят ее адрес

0

Решение

Я думаю, что то, что вы пытаетесь сделать, сильно повредит читабельности вашего кода. Изменение конструктора встроенного класса (даже если это возможно) наверняка удивит любого, кто читает ваш код. Лучшим решением было бы просто добавить функцию куда-нибудь

void addVariantToUnicodeString(UnicodeString& string, Variant& v){
string = string + UnicodeString(v1.As<UnicodeString>());
}

Или что-то в этом роде (возможно, с использованием шаблонов). Теперь просто замените ваш код соответственно. В качестве дополнительного преимущества ваш код теперь будет четко указывать, что он делает, вместо того, чтобы просто выполнять неясные строковые операции. Конечно, вы также можете создать свой собственный класс управления строками, обеспечивающий необходимую вам функциональность. Это немного зависит от сложности и масштабов вашей проблемы.

0

Другие решения

PS. UnicodeString — системный класс, поэтому я не могу изменить его напрямую.

В C ++ Builder UnicodeString а также AnsiString/AnsiStringT просто классы, как и любой другой (хотя вы не можете получить от них пользовательских потомков, так как они помечены как __declspec(delphireturn) чтобы предотвратить это). UnicodeString объявлен в ustring.h, AnsiStringT объявлен в dstring.h, а также AnsiString объявлен в sysmac.h (как вы уже указали). Вы можете просто отредактировать ustring.h а также dstring.h добавить пользовательские конструкторы в эти классы, например:

ustring.h

namespace System
{
...
class RTL_DELPHIRETURN UnicodeString
{
...
public:
...
explicit __fastcall UnicodeString(const Variant &src) : Data(0) { *this = src.As<UnicodeString>(); }
...
};
...
}

dstring.h

namespace System
{
...
template <unsigned short CP>
class RTL_DELPHIRETURN AnsiStringT : public AnsiStringBase
{
...
public:
...
explicit __fastcall AnsiStringT(const Variant &src) : AnsiStringBase() { *this = src.As< AnsiString<T> >();}
};
...
}

Альтернативой было бы определить обычай operator+() в своем собственном коде, чтобы объединить Variant к UnicodeString:

UnicodeString operator+(const UnicodeString& s, const Variant& v)
{
return s + v.As<UnicodeString>();
}

Но это потребует изменения утверждений, подобных этому:

string = string + UnicodeString(v1);

На это вместо этого:

string = string + v1;

И если вы собираетесь пойти на неприятности с внесением этого изменения, то вы можете просто забыть все выше и сделать это вместо этого (как вы должны были делать в первую очередь):

string = string + v1.As<UnicodeString>();
0

По вопросам рекламы [email protected]