繁体   English   中英

C++ 返回仿函数 object 作为 std::function

[英]C++ Return a functor object as std::function

我有一个工厂方法返回一个std::function

class Builder {
public:
    function<void(Data&)> build();
}

和一个函子 object

class Processor {
protected:
    vector<int> content_;
public:
    void operator()(Data&) { 
         ....
    }
}

现在我想在工厂方法中返回函子,我写

function<void(Data&)> build() {
    Processor p;
    // Add items to p.content_

    function<void(Data&)> ret(p);

    return ret;
}

我的问题是: ret会保留p的副本吗? 如果是这样,当p.content_很大时,这会成为负担吗? 建议的实施方式是什么?

一个std::function持有并拥有它的价值。 实际上,它需要可复制的可调用 object,以便在复制自身时可以复制它。

您的 function 会像这样非常好,并且可能更快:

function<void(Data&)> build() {
    Processor p;

    // fill items

    return p; // p moved into the returned std::function (since C++14)
}

但是,如果您复制std::function周围, Processor object 也会被复制,因此复制std::function的成本取决于类型(就像它包含的任何类型擦除工具一样)

将使用的构造函数是这样的:

template< class F >
function( F f );

可以看到 object 会被复制。 如果你想避免这种情况,你可以移动可调用对象:

function<void(Data&)> ret(std::move(p));

然后构造函数将f移动到内部存储。

如果您的可调用对象很小,它将直接存储在 function object 中。 如果太大,内部存储将被动态分配。 无论哪种方式,移动生成的 function object 应该不会比移动原始的可调用 object 复杂(当直接存储在函数中时)甚至可能更便宜(当动态存储时)。

当性能很重要时,应避免复制,因为即使您的可调用对象不需要它们,它也可能涉及动态分配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM