簡體   English   中英

將函數對象傳遞給std :: function

[英]Passing a function object to std::function

我在使用函數對象創建std :: function實例時遇到了一些麻煩。 (我的環境是使用Visual Studio 2015的C ++11。)

首先,我有一個在函數對象的參數列表中使用的類。 這是說明要點的簡化版本。

class X
{
public:
    void zz(int a) const
    {
        std::cout << "X:zz, a = " << a << "." << std::endl;
    }
};

然后是函數對象,該對象在其operator()方法中使用X。

class Y
{
public:
    void operator()(const X& x)
    {
        x.zz(17);
    }
};

現在,我想將Y的實例包裝在std :: function中。 函數的類型為void(const X&),這是一個將對X的const引用作為參數的void函數。 方法Y:operator()具有此簽名。

void test_it
{
    X my_x;

    Y my_y;
    std::function<void(const X&)> f1(my_y);
    f1(my_x); // OK

    std::function<void(const X&)> f2(Y());
    f2(my_x); // cannot convert argument 1 from X to Y

    std::function<void(const X&)> f3(Y);
    f3(my_x); // cannot convert argument 1 from X to Y

    std::function<void(const X&)> f4(Y{});
    f4(my_x); // OK
}

第一個示例f1創建Y的實例my_y,並使用該實例創建f1。 這很好。 (Y的內容被移入std :: function構造函數的std :: function中。)

第二次嘗試f2在f2的構造函數中構造Y的實例。 當我嘗試使用f2(my_x)調用它時,編譯器抱怨它無法將參數1(my_x)從X轉換為Y。

第三次嘗試f3,我僅在f3的std :: function構造中命名函數對象類的方式與f2相同。

最后,f4起作用。 在這一節中,我使用一個空的初始化列表構造函數對象Y。

也許有一個簡單的解釋,但是我看不到為什么其中兩個用例無法編譯。 特別是使用Y()的f2和使用Y {}的f4似乎與我完全相同。

對於第二種情況,表達式Y()試圖定義一個返回Y並且不接受任何參數的函數,並將該函數作為參數傳遞。 這被稱為最煩人的解析

對於第三種情況,您不能給出類型而不是函數參數。

Y的默認構造實例傳遞給std::function的正確方法是第4種情況。

暫無
暫無

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

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