Borland C++Builder 中 C++ 构造函数的扩展。
我有一些连接 UnicodeString
的代码值(以前的 AnsiString
)。
UnicodeString string="test1";
Variant v1="test";
string = string + UnicodeString(v1);
[bcc32 Error] myTest.cpp(154): E2015 Ambiguity between 'System::UnicodeString::UnicodeString(const System::UnicodeString &) at c:\program files (x86)\embarcadero\studio\17.0\include\windows\rtl\ustring.h:86' and 'System::UnicodeString::UnicodeString(const wchar_t *) at 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>())
我知道这可以通过以某种方式(不确定如何)扩展
UnicodeString
的构造函数或 typedef 来实现通过添加 UnicodeString(Variant)
(或宏?)。PS。
UnicodeString
是系统类,所以不能直接修改。PS1。
AnsiString
也有同样的问题(甚至更多的代码片段)。 .制作函数不起作用:(。对于AnsiString
它不起作用:(。AnsiString
的定义在系统头文件(sysmac.h)中:typedef AnsiStringT<0> AnsiString;
例子:
AnsiString myTest::AnsiString(Variant v)
{
return "";
}
[bcc32 Error] .cpp(122): E2235 Member function must be called or its address taken
最佳答案
我认为您正在尝试做的事情会严重损害代码的可读性。更改内置类的构造函数(即使有可能)肯定会让任何阅读您的代码的人感到惊讶。更好的解决方案是在某处添加一个函数
void addVariantToUnicodeString(UnicodeString& string, Variant& v){
string = string + UnicodeString(v1.As<UnicodeString>());
}
或类似的东西(可能使用模板)。现在只需相应地替换您的代码。作为一个额外的好处,您的代码现在将清楚地说明它正在做什么,而不是简单地执行晦涩的字符串操作。当然,您也可以构建自己的字符串管理类来提供您需要的功能。这稍微取决于您的问题的复杂性和程度。
关于c++ - c++构造函数/typedef的扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34809152/