gpt4 book ai didi

Boost.Python 中的 C++ 静态

转载 作者:行者123 更新时间:2023-11-30 02:46:32 26 4
gpt4 key购买 nike

我有一个 C++ 类,其中包含某种“静态”(在这种特殊情况下为“m_engine”):

class RndGenerator
{
public:
static void setInitialSeed(unsigned int seed);
static unsigned int rndNumber();
...
private:
...
RndGenerator();
static std::mt19937 m_engine;
};

这个类在我的项目中广泛使用,在 C++ 级别。

通过 Boost.Python 公开 RndGenerator 之后:

class_<RndGenerator, boost::noncopyable>("RndGenerator", no_init)
.def("setInitialSeed", &RndGenerator::setInitialSeed)
.staticmethod("setInitialSeed")
.def("rndNumber", &RndGenerator::rndNumber)
.staticmethod("rndNumber")
;

我希望能够从 Python 级别设置初始种子:

 RndGenerator.setInitialSeed(1234)

我希望,在这一行之后,所有对 RndGenerator::rndNumber() 的调用,在 C++ 级别上,都会考虑到刚刚指定的初始种子 (1234)。然而,事实并非如此。

包含暴露给 Python 的静态成员的类有什么问题吗?还是我的问题与 RndGenerator 的单例性质有关?

最佳答案

在公开的 C++ 类上使用静态数据成员或静态成员函数的 Boost.Python 应该没有问题。这有可能是假阳性吗?或者,对于相同模板在多个翻译单元中实例化的更复杂和特定的情况,然后使用动态库,具有相同符号名称的静态数据成员的多个实例可能驻留在相同的进程空间中。

无论如何,这里有一个完整的示例,展示了在使用 Boost.Python 公开的类上静态成员函数和静态数据成员的预期行为:

#include <boost/python.hpp>

// Basic mockup type.
class spam
{
public:
static void set_x(unsigned int x) { x_ = x; }
static unsigned int get_x() { return x_; };
private:
spam() {};
spam(const spam&);
spam& operator=(const spam&);
static unsigned int x_;
};

unsigned int spam::x_ = 0;

// Auxiliary function.
bool spam_check_x(unsigned int x)
{
return x == spam::get_x();
}

BOOST_PYTHON_MODULE(example)
{
namespace python = boost::python;
python::class_<spam, boost::noncopyable>("Spam", python::no_init)
.def("setX", &spam::set_x)
.staticmethod("setX")
.def("getX", &spam::get_x)
.staticmethod("getX")
.def("checkX", &spam_check_x)
.staticmethod("checkX")
;
}

交互使用:

>>> from example import Spam
>>> x = 42
>>> assert(Spam.getX() != x)
>>> assert(not Spam.checkX(x))
>>> Spam.setX(x)
>>> assert(Spam.getX() == x)
>>> assert(Spam.checkX(x))
>>> x = 43
>>> assert(Spam.getX() != x)
>>> assert(not Spam.checkX(x))

关于Boost.Python 中的 C++ 静态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23490543/

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