gpt4 book ai didi

python - 将 boost::python::object 转换为(非常量)左值

转载 作者:搜寻专家 更新时间:2023-10-31 02:20:11 30 4
gpt4 key购买 nike

所以这个问题与我为实际问题选择的解决方案有关,为了尽可能提供完整的图片,这个问题是这样的:基本上我有一个带有很多模板参数的函数,我正在尝试暴露给 Python。与用宏做一些噩梦般的事情来消除我需要的所有模板参数组合相反,我一直在使用 boost::python::object 进行类型删除,然后使用 提取以从中获取我需要的类型。

但是,似乎不可能从 boost::python::extract 中获取非常量左值。这是一个玩具问题:

#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 中获取一个非常量左值,但我不知道该怎么做。

想法?

最佳答案

当你这样做时:

boost::python::extract<Dog> 

你得到了一只。如果您随后想取回左值引用,则需要构造适当的 extract 对象:

boost::python::extract<Dog&>

当然,更多的 Python 解决方案是只停留在 Python 领域。像这样的东西:

void make_noise(boost::python::object o) {
o.attr("noise")();
}

关于python - 将 boost::python::object 转换为(非常量)左值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33019147/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com