如何直接将BSTR传入wstringstream,避免创建临时std::wstring?
直接将BSTR写入std::wstringstream(避免临时std::wstring)
当然可以做到,不用创建临时std::wstring就能直接把BSTR写入wstringstream,给你两种实用方法:
方法一:直接用write成员函数
std::wstringstream的write方法支持直接写入指定长度的宽字符数组,正好适配BSTR的特性——BSTR本身就是带长度信息的宽字符串,用SysStringLen拿到准确长度后直接写入即可:
std::wstring proc(BSTR bStr) { std::wstringstream ss; ss << L"The string is: "; // 直接写入BSTR内容,无需临时对象 ss.write(bStr, SysStringLen(bStr)); return ss.str(); }
方法二:重载流插入运算符(更易用)
如果想让代码写法和普通字符串一致,直接用<<输出BSTR,可以自定义一个全局的流插入运算符重载,内部还是用write实现:
#include <combaseapi.h> // 确保包含SysStringLen的头文件 // 重载BSTR的流插入运算符 std::wostream& operator<<(std::wostream& os, BSTR bstr) { if (bstr != nullptr) // 处理空指针情况,避免非法访问 { os.write(bstr, SysStringLen(bstr)); } return os; } // 使用示例 std::wstring proc(BSTR bStr) { std::wstringstream ss; ss << L"The string is: " << bStr; // 和输出普通宽字符串写法完全一致 return ss.str(); }
注意事项
- 记得包含
SysStringLen对应的头文件,通常是<combaseapi.h>或者<oleauto.h> - 务必处理BSTR为
nullptr的情况,防止程序崩溃
内容的提问来源于stack exchange,提问作者Mr. Boy
相关产品推荐
相关产品推荐

