[英]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.