在Borland C ++ Builder中扩展C ++构造函数。
我有一些代码可以连接UnicodeString
值(以前为AnsiString
)。
UnicodeString string="test1";
Variant v1="test";
string = string + UnicodeString(v1);
[bcc32错误] myTest.cpp(154):E2015之间的歧义 '系统:: UnicodeString :: UnicodeString(const System :: UnicodeString&)在c:\ program files(x86)\ embarcadero \ studio \ 17.0 \ include \ windows \ rtl \ ustring.h:86'和 c:\ program files(x86)\ embarcadero \ studio \ 17.0 \ include \ windows \ rtl \ ustring.h:89'中的'System :: UnicodeString :: UnicodeString(const wchar_t *)
现在,问题是Variant
含糊不清,编译器抱怨这种歧义(足够公平)。
如果我将直接演员添加到string
,它就可以了。
string = string + UnicodeString(v1.As<UnicodeString>());
问题是我的代码很庞大,而且有成千上万的这样的代码。我想介绍一个新的显式typedef或宏来执行此操作:
鉴于参数v1为Variant
,它将执行而不是:
UnicodeString(v1)
它执行此操作:
UnicodeString(v1.As<UnicodeString>())
我理解这可以通过添加UnicodeString
以某种方式(不确定如何)扩展UnicodeString(Variant)
的构造函数或typedef来实现。
(或宏?)。
PS。 UnicodeString
是一个系统类,所以我不能直接修改它。
PS1。与AnsiString
相同的问题(甚至更多的代码片段)。使函数不起作用:(。对于AnsiString
,它不起作用:(。
系统头(sysmac.h)中AnsiString
的定义:
typedef AnsiStringT<0> AnsiString;
示例:
AnsiString myTest::AnsiString(Variant v)
{
return "";
}
[bcc32错误] .cpp(122):E2235必须调用成员函数或其地址
答案 0 :(得分:0)
我认为您尝试做的事情会严重损害您的代码的可读性。更改内置类的构造函数(即使它是可能的)对于阅读代码的任何人来说肯定会令人惊讶。更好的解决方案是在某处添加功能
void addVariantToUnicodeString(UnicodeString& string, Variant& v){
string = string + UnicodeString(v1.As<UnicodeString>());
}
或类似的东西(可能使用模板)。现在只需相应地替换你的代码。作为额外的好处,您的代码现在将清楚地说明它正在做什么,而不是简单地执行模糊的字符串操作。当然,您也可以构建自己的字符串管理类,提供所需的功能。这略微取决于问题的复杂程度和程度。
答案 1 :(得分:0)
PS。 UnicodeString是一个系统类,所以我不能直接修改它。
在C ++ Builder中,UnicodeString
和AnsiString
/ AnsiStringT
只是与其他类似的类(尽管您无法从它们派生自定义后代,因为它们被标记为{{1防止这种情况)。 __declspec(delphireturn)
中声明了UnicodeString
,ustring.h
中声明了AnsiStringT
,dstring.h
中声明了AnsiString
(正如您已经指出的那样)。您只需编辑sysmac.h
和ustring.h
即可向这些类添加自定义构造函数,例如:
ustring.h
dstring.h
dstring.h
namespace System
{
...
class RTL_DELPHIRETURN UnicodeString
{
...
public:
...
explicit __fastcall UnicodeString(const Variant &src) : Data(0) { *this = src.As<UnicodeString>(); }
...
};
...
}
另一种方法是在您自己的代码中定义自定义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;