在带有C++;接受std::wstring的函数 我使用Boost Python库来包装一个C++类,以便可以从Python调用它的方法。我的C++类 Clazz < /C> >有公共方法: void doSomething(std::string& s) { ... } void doSomethingWide(std::wstring& ws) { ... }

在带有C++;接受std::wstring的函数 我使用Boost Python库来包装一个C++类,以便可以从Python调用它的方法。我的C++类 Clazz < /C> >有公共方法: void doSomething(std::string& s) { ... } void doSomethingWide(std::wstring& ws) { ... },python,c++,boost,unicode,boost-python,Python,C++,Boost,Unicode,Boost Python,我创建了一个BOOST\u PYTHON\u模块,它指向这两种方法。第一个使用std::string的,我可以调用fine。但是,当我尝试使用Python Unicode字符串调用第二个时: x = u'hello' Clazz.doSomethingWide(x) 我得到一个错误: ArgumentError:中的Python参数类型 Clazz.doSomethingWide(Clazz,unicode) 与C++签名不匹配: 剂量测定法(Clazz,标准::wstring) 我曾希望un

我创建了一个
BOOST\u PYTHON\u模块
,它指向这两种方法。第一个使用
std::string
的,我可以调用fine。但是,当我尝试使用Python Unicode字符串调用第二个时:

x = u'hello'
Clazz.doSomethingWide(x)
我得到一个错误:

ArgumentError:中的Python参数类型
Clazz.doSomethingWide(Clazz,unicode)
与C++签名不匹配:
剂量测定法(Clazz,标准::wstring)

我曾希望
unicode
会自动与
std::wstring
接口,就像常规Python字符串类型与
std::string
接口一样。然而,情况似乎并非如此

在另一个线程中,有人建议首先进行转换:

x = str(x.encode('utf-8'))
但是,我处理的是非常大的字符串,这会破坏代码的性能,因为
x
的字符数是O(n)


<>我确实有能力修改我试图与之连接的C++库。有没有办法将Python <代码> Unicode < /Code >类型以我可以使用的方式传入我的C++库?我在互联网上搜索了很多地方,找到了一些对转换器和其他东西的引用,但是实现它们并没有修复上面的错误消息(很可能我没有正确使用它们)。

简而言之,类型转换通常会导致右值对象,因此参数必须按值或按常量引用接受。因此,改变:

void doSomethingWide(std::wstring&);
以下任何一项:

void doSomethingWide(标准::wstring);
void doSomethingWide(常数std::wstring&);

Python于2003年9月11日添加。一般来说,当Boost.Python中发生类型转换时,生成的对象将被视为右值。观察者规范中间接提到了这种行为:

将存储的指针转换为
result\u type
,即
T
T const&

如果支持左值转换,它可能会为某些类型引入笨拙的语义。例如,不可变的Python字符串可以用C++函数修改。
下面是一个完整的最小示例:

#包括
#包括
#包括
类垃圾邮件
{
公众:
void doSomething(const std::string和str)
{
std::cout spam=example.spam()
>>>垃圾邮件。剂量测量(“测试”)
spam::doSomething():测试
>>>spam.doSomethingWide(u“测试”)
spam::doSomethingWide():测试