c ++构造函数/ typedef的扩展

时间:2016-01-15 10:35:39

标签: c++ error-handling typeof unicode-string

在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必须调用成员函数或其地址

2 个答案:

答案 0 :(得分:0)

我认为您尝试做的事情会严重损害您的代码的可读性。更改内置类的构造函数(即使它是可能的)对于阅读代码的任何人来说肯定会令人惊讶。更好的解决方案是在某处添加功能

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

或类似的东西(可能使用模板)。现在只需相应地替换你的代码。作为额外的好处,您的代码现在将清楚地说明它正在做什么,而不是简单地执行模糊的字符串操作。当然,您也可以构建自己的字符串管理类,提供所需的功能。这略微取决于问题的复杂程度和程度。

答案 1 :(得分:0)

  

PS。 UnicodeString是一个系统类,所以我不能直接修改它。

在C ++ Builder中,UnicodeStringAnsiString / AnsiStringT只是与其他类似的类(尽管您无法从它们派生自定义后代,因为它们被标记为{{1防止这种情况)。 __declspec(delphireturn)中声明了UnicodeStringustring.h中声明了AnsiStringTdstring.h中声明了AnsiString(正如您已经指出的那样)。您只需编辑sysmac.hustring.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;