簡體   English   中英

我可以在沒有 auto 的情況下定義 C++ lambda 函數嗎?

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

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