簡體   English   中英

與 for_each 或 std::transform 一起使用時如何調用 C++ 仿函數構造函數

[英]How do C++ functor constructors get called when used with for_each or std::transform

我以前從未使用過 c++ 仿函數,所以我只是想了解它們是如何工作的。

例如假設我們有這個函子 class

class MultiplyBy {
private:
    int factor;

public:
    MultiplyBy(int x) : factor(x) { }

    int operator () (int other) const {
        return factor * other;
    }
};

像這樣使用它對我來說很清楚:

MultiplyBy mult_3(3);

int x = mult_3(100);

顯然 MultiplyBy 的構造函數是用參數 3 調用的。

但是在以下情況下,如何使用數組中的值調用構造函數?

int array[5] = {1, 2, 3, 4, 5};
std::transform(array, array + 5, array, MultiplyBy(3));

好吧,在最后一種情況下,您將創建一個新的MultiplyBy object,其中 3 作為構造函數參數。 然后將此 object 傳遞給std::transform ,然后調用operator()

如果它可以幫助您更好地理解,這是相同的:

int array[] = {1, 2, 3, 4, 5};
MultiplyBy times3(3);
std::transform(array, array + 5, array, times3);

您可以認為 transform 的結構如下:

void transform(Iterator b, Iterator e, Functor f)
{
    for(;b != e; ++b)
    {
        *b = f(*b);
    }
}

函子按值傳遞給 function。
所以當你這樣打電話時:

std::transform(array, array + 5, array, MultiplyBy(3));

在這里,您創建了一個臨時 object。 這作為參數值傳遞給 transfer()。 這導致仿函數被復制到 function 中(這不是問題,因為它只有一個 POD 成員並且編譯器生成的復制構造函數工作得很好)。 然后該參數就可以正常使用了。

注意:臨時 object 在創建它的表達式的末尾被銷毀(這將在 transform() 返回之后)。

MultiplyBy(3)創建了一個未命名的臨時變量,該變量將傳遞給transform並(此時)在 function 中給出相應的參數名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM