为了跟进@MSalters的回答,一个自定义用户定义的字面量可能会看起来像这样:
CComBSTR operator "" _bstr (const char* str, std::size_t len)
{
return CComBSTR(len, str);
}
那么你可以这样做(因为CComBSTR
定义了一个BSTR
转换运算符):
iFoo->function( "HELLO"_bstr )
你甚至可以为多个输入字符串字面类型重载运算符:
CComBSTR operator "" _bstr (const wchar_t* str, std::size_t len)
{
return CComBSTR(len, str);
}
CComBSTR operator "" _bstr (const char16_t* str, std::size_t len)
{
return CComBSTR(len, (wchar_t*)str);
}
iFoo->function( L"HELLO"_bstr ); // calls wchar_t* version with UTF-16 encoded data
iFoo->function( u"HELLO"_bstr ); // calls char16_t* version with UTF-16 encoded data
iFoo->function( u8"HELLO"_bstr ); // calls char* version with UTF-8 encoded data...
注意最后一种情况。因为操作符无法知道是否传递的是ANSI或UTF-8数据,而CComBSTR
在传递char*
数据时假定为ANSI,所以您应该使用不同的字面量后缀来区分它们,以便正确转换UTF-8,例如:
CComBSTR operator "" _utf8bstr (const char* str, std::size_t len)
{
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t> conv;
std::wstring wstr = conv.from_bytes(std::string(str, len));
return CComBSTR(wstr.length(), wstr.c_str());
}
iFoo->function( u8"HELLO"_utf8bstr );
SysFreeString()
就更糟了 :) - Frédéric Hamidibstr_t
或CComBSTR
。 - WhozCraigBSTR
都应该遵守规则,因此它的构建不取决于你,而是取决于微软。他们会记录它们,这很好,但他们也可以自由地更改它们。试图字面化它很容易,甚至比遵守规则更繁琐。例如:您提出的“非常丑陋”的解决方案不符合规范(它没有两个终止空值)。为什么你要那样做呢?而且你可以完全放弃 COM 为你执行的 BSTR 缓存。 - WhozCraig