C ++重载wchar_t赋值运算符

时间:2018-07-19 07:10:21

标签: c++ operator-overloading assignment-operator

我有一个具有Unicode BSTR字符串成员的结构,如下所示:

struct Foo
{
    wchar_t* Bar;
}

如果我现在想设置该字符串成员,我会这么做

Foo f;
f.Bar = SysAllocString(L"Hello world");

有点冗长。


有什么方法可以“重载” wchar_t赋值运算符,以便隐藏SysAllocString调用并可以简单地编写

Foo f;
f.Bar = L"Hello world";

重载的赋值运算符将在哪里处理SysAllocString调用?

我正在考虑这样的东西(伪代码):

wchar_t* ???::operator=(const wchar_t* rhs)
{
    return SysAllocString(rhs);
}

但是由于我不在上课,所以我不知道要用什么来代替???

2 个答案:

答案 0 :(得分:2)

wchar_t是内置类型,因此您不能在其上重载运算符。话虽如此,您可以使用std::wstring代替原始指针,也可以定义Foo::operator=(wchar_t*)

struct Foo
{
    wchar_t* Bar;
    Foo& operator=(wchar_t* bar) { Bar = SysAllocString(bar); return *this; }
}

Foo foo;
foo = L"Hello, World!";

来自评论:

  

[U]很遗憾,这对我不起作用。我一直在寻找一种适用于任意结构的解决方案,而不必针对每种结构本身都提出您建议的解决方案

您可以在基类中定义该运算符:

struct FooBase
{
    wchar_t* Bar;
    Foo& operator=(wchar_t* bar) { Bar = SysAllocString(bar); return *this; }
}

struct Foo : FooBase { /* whatever */ };
Foo foo;
foo = L"Hello, World!";

...或者您知道使用标准库中的类型:)

答案 1 :(得分:2)

首先,如果要成为BSTR,则该成员应为:

struct Foo
{
    BSTR Bar;
};

尽管BSTRwchar_t *a BSTR has different semantics to a string of wchar_t的typedef,所以它可以作为自文档。


现在,在C ++编程中,OLE使用类管理BSTR是正常的。您可以使用现有的,也可以自己使用。恕我直言,最好使用已经存在的一种,尽管自己动手可以是一种有趣的学习体验。

我不建议尝试将BSTR管理功能拼接到Foo。这导致违反“五/零”规则。 BSTR管理应该独立于其自己的类,然后您可以将其中一个容器声明为Foo的成员。


如果您使用的是Microsoft ATL,则可能有_bstr_tCComBSTR可用。

在MinGW-w64中,_bstr_t#include <stdio.h>一起可用,然后#include <comutil.h>并与-loleaut32链接。

其他一些编译器/框架为BSTR拥有自己的包装器类。