簡體   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