我有這樣一個函式,如果list中的任何元素與給定的predicate
true。
bool _any(bool (*predicate)(MyStructure), list< MyStructure> arr)
{
for (int i = 0; i < arr.size() ; i )
{
if (predicate(arr.front())
return true。
arr.pop_front()。
}
return false;
這對非常簡單的lambdas是有效的,但是如果給定的lambda需要捕獲this,那么我就會出現一個錯誤,我不知道如何解決。
Assert::IsTrue(_any(
[this](MyStructure t)
{
return t._name == "NAME_SEARCHED" &&
t._type == "TYPE_SEARCHED" &&
_any([](OtherStruct o) { return o._name == "SEARCHED_2"; }, t._children);
},
myList))。
錯誤:
不能將引數1從'UTests::<lambda_e8bda0383e9f0c2ae44be631a7424852> '
到'bool (__cdecl *)(MyNameSpace::MyStructure)'/span>
(N.B.: _any也定義了需要一個OtherStruct的內容)。
uj5u.com熱心網友回復:
你不能將有狀態的lambda轉換為函式指標!
問題是,_any函式期望一個型別為bool (*)(MyStructure)的函式指標,而不是一個lambda函式。你可以將λ轉換為一個函式指標,如果它是一個無捕獲的λ的話。
這意味著,在這里
Assert::IsTrue(_any(
[this](MyStructure t)
//^^^^ ---> 捕獲 "this"。
{
// .../span>
},
myList))。
你正試圖將一個lambda函式(捕獲實體)轉換為型別化的函式指標。 這是不可能的,因此出現了編譯器錯誤。
我不知道如何解決。
我不知道如何解決。
讓_any成為一個模板函式,這樣編譯器就可以為你做推導。
template<typename Callable>
bool _any(Callable predicate, std::list<MyStructure> const& arr)
{
// ...
return false。
}
#include <functional> //std::function
bool _any(std::function<bool(MyStructure)> const& predicate
, std::list<MyStructure> const& arr)
{
// ...
return false。
}
uj5u.com熱心網友回復:
只要像std::for_each()那樣使用一個模板引數。
順便說一下,我不確定按值傳遞串列并消耗它是否有必要。
template<typename Predicate>
bool _any(Predicate predicate, const list<MyStructure> & arr)
{
for(const auto & elem: arr)
{
if (predicate(elem))
return true;
}
return false;
最后,你可以依靠std::any_of()。
template<typename Predicate>
bool _any(Predicate predicate, const list<MyStructure> & arr)
{
return std::any_of(cbegin(arr), cend(arr), predicate)。
}
看看<algorithm>的現有功能,幾乎 "一切 "都已經存在,并且由于預期作為模板引數的lambda-closures,可以適應特定語境。
一般來說,std::function應該只在閉包需要被存盤以便以后被呼叫時使用(執行緒,回呼...)。
如果閉包直接在函式中使用,并且在函式回傳時不再需要存在,那么模板解決方案是首選,因為它節省了一些記憶體和效率。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/314178.html
標籤:
上一篇:std::bind的結果是如何多次呼叫復制建構式的?
下一篇:標準運算式中的資料型別不匹配
