[英]Can I define a C++ lambda function without auto?
我以前有很多 C# 經驗,但我是 C++ 新手。 我在嘗試使用 lambda 時遇到過這個問題。
例如:
auto compare = [] (int i1, int i2) { return i1*2 > i2; }
有沒有辦法用特定類型定義 lambda,而不是自動推導?
我問這個是因為我想為我的班級定義一個通用的 lambda。 這個 Lambada 將在多個地方使用,所以我不想多次定義它們。 但是,'auto' 只能用於靜態成員,而另一方面,我想訪問 lambda 中的非靜態字段。
您使用std::function
,它可以對任何 lambda 或函數指針進行 glob。
std::function< bool(int, int) > myFunc = []( int x, int y ){ return x > y; };
請參閱C++ 參考。
您可以使用std::function
,但如果這不夠高效,您可以編寫一個類似於 lambdas 在幕后所做的函子對象:
auto compare = [] (int i1, int i2) { return i1*2 > i2; }
幾乎一樣
struct Functor {
bool operator()(int i1, int i2) const { return i1*2 > i2; }
};
Functor compare;
如果函子應該在上下文中捕獲一些變量(例如“this”指針),則需要在函子內添加成員並在構造函數中初始化它們:
auto foo = [this] (int i) { return this->bar(i); }
幾乎一樣
struct Functor {
Object *that;
Functor(Object *that) : that(that) {}
void operator()(int i) const { return that->bar(i); }
};
Functor foo(this);
如上所述,您可以使用 as std::function<Signature>
,但以類型擦除 lambda 為代價。 當您調用 lambda 時,這將添加一個間接(基本上是一個虛函數調用)。 因此請記住,如果您將在重要的上下文中使用它,效率會降低。
在沒有std::function
開銷的情況下執行此操作的方法是,如果您覺得函子太麻煩,則可以使用函數指針、typedef 和可選的宏。
在您的示例中,此函數指針如下所示:
bool (*compare)(int, int) = [] (int i1, int i2) { return i1*2 > i2; };
^^^^^^^^^^^^^^^^^^^^^^^^^
請注意,指針的標識符compare
是如何塞進括號中的,這有時會讓人們感到困惑,但這是聲明函數指針的正確方法。
你可以用同樣的方式寫一個 typedef:
typedef bool (*Compare)(int, int);
typedef 名稱是標識符通常所在的位置。 這使您現在可以編寫更簡潔的內容:
Compare func = [] (int i1, int i2) { return i1*2 > i2; };
^^^^^^^^^^^^
如果您允許自己使用宏,您可以在人體工程學方面走得更遠:
#define CompareLambda [](int i1, int i2)
typedef bool (*Compare)(int, int);
...
Compare func = CompareLambda{ return i1*2 > i2;};
宏和 typedef 作為工具存在,通過幫助您避免重復自己,使您作為程序員的工作更輕松,不要害怕使用它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.