使用重载函数将 Python 'int'提升为 C++ int
Boost Python 'int' to C++ int with overloaded function
当我收到此错误消息时,我有些惊讶。
TypeError: unsupported operand type(s) for <<: 'Packet' and 'int'
我试图做的是通过 boost python 公开一个类,该类重载__lshift__
操作数以采用几种不同的对象类型 - 例如 int、float、char* 等。我正确地公开了类,但是当我尝试类似packet << 10
时,我遇到了上述错误。
明白为什么会这样,但我不确定我应该如何解决这个问题。我不能完全使用 boost::p ython::object 进行重载,因为那样它就无法区分packet << 10
和packet << 10.5
。
一种可能的解决方案是将函数公开为__lshift__
以外的其他功能。然后我可能会得到packet.saveInt(10)
和packet.saveFloat(10.5)
,但这破坏了我们都非常钦佩的python语法糖。
我的另一个想法是,我可以围绕内置的int类型创建一个非常薄的类并将其纳入其中。
struct Int32 {
Int32(bp::object obj) {
if (PyInt_Check(obj.get()) {
value = bp::extract<int>(obj);
}
PyErr_SetObject(PyExc_ValueError, obj);
bp::throw_error_already_set();
}
int value;
}
BOOST_PYTHON_MODULE(intwrapper)
{
bp::class_<Int32>("Int32", bp::init<bp::object>)
.def("value", &Int32::value);
}
有了这个,我可以执行以下操作。 packet << Int32(10)
和类似的packet << Float(10.5)
.这有点黑客,我希望有更好的方法。
有什么建议吗?谢谢!
经过更多的调查,我发现问题是我试图通过引用传递一个int,而Python不支持这一点。
我尽力保留语法糖,但最终公开了不同的运算符 <<() 和运算符>>() 方法,如 saveInt32(value)、saveString(value)、loadInt32()、loadString() 等。
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- int(c) 和 c-'0' 之间的区别。C++
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 是否可以从int转换为enum类类型
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 'short int'持有的值溢出,但"自动"不会溢出?
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 调用'begin(int [n])'没有匹配函数
- 没有显式声明的int[]中的foreach
- 在c++中访问int到类对象的映射时出错
- 为什么我无法更改"set<set>"循环中的值<int>
- 长 长 int 不要 长 int 好
- C++程序在循环后给出奇怪的int值
- 如何计算数据类型的范围,例如int
- 如果"new int"返回"int*",那么为什么"new int[n]"不返回"int**"?
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)