我有一个具有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);
}
但是由于我不在上课,所以我不知道要用什么来代替???
。
答案 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;
};
尽管BSTR
是wchar_t *
,a BSTR
has different semantics to a string of wchar_t
的typedef,所以它可以作为自文档。
现在,在C ++编程中,OLE使用类管理BSTR
是正常的。您可以使用现有的,也可以自己使用。恕我直言,最好使用已经存在的一种,尽管自己动手可以是一种有趣的学习体验。
我不建议尝试将BSTR管理功能拼接到Foo
。这导致违反“五/零”规则。 BSTR管理应该独立于其自己的类,然后您可以将其中一个容器声明为Foo
的成员。
如果您使用的是Microsoft ATL,则可能有_bstr_t和CComBSTR可用。
在MinGW-w64中,_bstr_t
和#include <stdio.h>
一起可用,然后#include <comutil.h>
并与-loleaut32
链接。
其他一些编译器/框架为BSTR
拥有自己的包装器类。