[英]Passing a std::shared_ptr to a function object to std::thread
[英]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.