C++ 重载 wchar_t 赋值运算符

C++ Overload wchar_t assignment operator

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

struct Foo
{
    wchar_t* Bar;
}

如果我现在想设置那个字符串成员,我会这样做

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

有点冗长。


有什么办法可以让 "overload" 成为 wchar_t 赋值运算符,这样我就可以隐藏 SysAllocString 调用并且可以简单地写

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

重载赋值运算符在哪里负责 SysAllocString 调用?

我在想这样的事情(伪代码):

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

但我不知道用什么代替 ???,因为我不是在处理 class。

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]nfortunately that won't work for me. I was looking for a solution that works for arbitrary structs without having to do your proposed solution for every struct itself

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

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!";

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

首先,如果它是 BSTR 那么成员应该是:

struct Foo
{
    BSTR Bar;
};

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


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

我不建议尝试将 BSTR 管理功能拼接到 Foo。这会导致违反 Five/Zero 规则。 BSTR 管理应该在其自己的 class 中是独立的,然后您可以将这些容器之一声明为 Foo.

的成员

如果您使用的是 Microsoft ATL,那么您可能 _bstr_t and CComBSTR 可用。

在 MinGW-w64 中,_bstr_t 可用于 #include <stdio.h>,然后 #include <comutil.h> 和 link 可用于 -loleaut32

其他一些 compilers/frameworks 有自己的包装器 class 用于 BSTR