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;
};
尽管 BSTR
是 wchar_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
。
我有一个包含 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;
};
尽管 BSTR
是 wchar_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
。