将boost::python::object转换为(非const)左值
Converting boost::python::object to (non-const) lvalue
所以这个问题是关于我选择的解决方案来解决我的实际问题,为了尽可能完整地给出一个图片,它是这样的:基本上,我有一个函数,有很多模板参数,我试图向Python公开。与使用宏来消除我需要的所有模板参数组合的噩梦相反,我一直使用boost::python::object
进行类型擦除,然后使用extract
从中获取我需要的类型。
然而,似乎不可能从boost::python::extract
中获得非const左值。这里有一个玩具问题:
#include<iostream>
#include<boost/python.hpp>
class Dog
{
public:
void noise() { std::cout << "WOOF" << std::endl; }
};
class Cat
{
public:
void noise() { std::cout << "MEOW" << std::endl; }
};
template< class Animal >
void make_noise(Animal & a)
{ a.noise(); }
//Wrapping for boost python
void make_noise_py(boost::python::object & a)
{
{
boost::python::extract<Dog> get(a);
if(get.check())
{
Dog & d = get();
make_noise(d);
}
}
{
boost::python::extract<Cat> get(a);
if(get.check())
{
Cat & c = get();
make_noise(c);
}
}
}
BOOST_PYTHON_MODULE(main)
{
boost::python::def("make_noise", make_noise_py);
}
请注意,虽然这个问题只有一个模板参数和两个选项,我的实际问题有大约4个模板参数,通常有两个以上的选项为每个…因此,冲压每个模板是不可能的,使用宏似乎更加混乱。我能看到的唯一其他选择是使用const_cast,如果可以的话,我也喜欢避免使用它。我真的很想从boost::python::object
中得到一个非const左值,但我不知道如何做到这一点。
想法吗?
当你这样做的时候:
boost::python::extract<Dog>
你会得到一个Dog
。如果希望返回左值引用,则需要构造相应的extract
对象:
boost::python::extract<Dog&>
当然,更Python的解决方案是留在Python领域。比如:
void make_noise(boost::python::object o) {
o.attr("noise")();
}
相关文章:
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 无法使用类型 'const char *' 的左值初始化类型 'char *' 的成员子对象
- 将返回类型专用化为 void 或 const 左值引用
- 为什么 const 函数返回左值而不是右值?
- 为什么我需要将默认引用参数定义为 const 以便为其分配一个左值?
- 为什么静态常量字符 * const 变量在为左值时可绑定到右值引用参数
- 无法使用类型 'const char [X]' 的左值初始化类型 'const signed char *' 的成员子对象
- 为什么不能将"const char*"的左值绑定到"const char* const&&?
- C++11:对const、volatile、左值引用和右值引用限定的成员函数指针进行抽象
- Memory_order在由非const左值传递时变为default
- 将boost::python::object转换为(非const)左值
- 让函数只接受非const左值
- 在c++ 11中将非const左值引用绑定到右值是否有效?(修改)
- 在初始化表达式中强制左值的const-ness
- 右值或左值(const)引用形参
- 是否需要重载接受const左值引用的方法来显式地进行右值引用?
- 错误:非const引用的初始值必须为左值
- 操作符+()选择右值引用变量而不是const左值变量
- 防止将左值引用绑定到非const对象
- 非const引用只能绑定到左值