首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法在Python中使用move而不是copy语义包装函数返回值(object)?

有没有办法在Python中使用move而不是copy语义包装函数返回值(object)?
EN

Stack Overflow用户
提问于 2013-09-28 10:43:55
回答 2查看 576关注 0票数 1

有没有办法包装一个C++函数,它使用移动语义返回一个对象(值,而不是指针或引用),而不复制对象?

示例:

我有一个函数,它创建一个大对象A,并使用它的move构造函数返回它:

代码语言:javascript
复制
class A {
public:
  A( A&& );
};

A createA() 
{
  // creates A here
  return std::move(A);
}

在C++中,我可以通过将A“移出”函数来避免复制A。现在,我需要使用boost python在Python中包装A和createA。据我所知,当一个函数返回一个对象时,boost python会自动调用A的复制构造函数。如果我没有为A提供一个拷贝构造函数,编译就会失败。我的问题是,是否有办法在不复制的情况下将对象“移动”到Python中。

EN

回答 2

Stack Overflow用户

发布于 2016-04-22 01:51:07

下面的代码应该可以工作

代码语言:javascript
复制
struct A
{
  A() = default;
  A(A&&) = default;
};

A createA()
{
  return {};
}

using bp = boost::python;


bp::class_<A, boost::noncopyable, std:: shared_ptr<A>> (
  "A", "noncopyable class A", bp::no_init);

bp::def(
  "createA",
  +[]()
  {
    return std::make_shared<A> (createA()); 
  });
票数 3
EN

Stack Overflow用户

发布于 2013-09-28 12:01:17

您可能正在尝试将一个值返回给一个新函数。例如:

代码语言:javascript
复制
def get_three():
    value = 3
    return value

def square(x):
    square = x * x
    return square

print square(get_three())

>> 9

您不必临时设置get_three的值,如下所示:

代码语言:javascript
复制
three = get_three()
print square(three)

你可以直接传入这个函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19062657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档