簡體   English   中英

如何編寫看起來像方法的lambda表達式?

[英]How do I write a lambda expression that looks like a method?

我一直在努力解決這個問題。 考慮下面的代碼(我假設已經定義了前向引用):

// Signature representing a pointer to a method call
typedef
   void (MyClass::*MyMethod)(int);

class MyClass
{
    MyClass();
    void method1(int i);
    void method2(int i);

    void associateMethod(int index, MyMethod m);
} 

鑒於以上所述,構造函數可以執行以下操作:

MyClass::MyClass()
{
   associateMethod(1, &MyClass::method1);
   associateMethod(2, &MyClass::method2);
}

但是,我希望能夠在第二個參數是匿名方法的情況下調用“ associateMethod”。 但是,以下內容無法編譯。

associateMethod(3, [this](int) -> void { /* some code here */ }

我收到一個錯誤消息,說它們無法從lambda轉換為MyMethod。

我想知道lambda語法是否需要在某個地方包含“ MyClass”,但會隨機猜測lambda表達式,例如

 MyClass::[this](int) -> void {}

要么

 [this]&MyClass::(int) -> void {}

不要編譯。

將不勝感激任何指針(無雙關語)

謝謝

您不能將lambda表達式轉換為類成員函數指針,並且沒有有效的語法使其看起來像1

而不是原始的函數指針,應將MyMethod聲明為std::function簽名(如注釋中所述):

using MyMethod = std::function<void(int)>;

然后可以使用lambdas初始化此參數,然后:

MyClass::MyClass()
{
   associateMethod(1, [this](int a) { this->method1(a); });
   associateMethod(2, [this](int a) { this->method2(a); });
}

1) Lambda函數可以視為編譯器生成的可調用類,該類將捕獲作為構造時的參數,並為operator()()重載您指定的參數和主體。 因此,不可能有效轉換為原始或成員函數指針。

user0042的答案似乎是解決之道,但是,出於完整性考慮,值得一提的是,在C ++ 17中,無捕獲lambda具有constexpr轉換運算符為其函數指針類型,因此,您應該(*)能夠轉換此類通過以下方式將lambda傳遞給成員函數指針:

// ...
void associateMethod(int index, MyMethod m);

template<typename F>
void associateMethod(int index, F m) {
  associateMethod( index,
    static_cast<MyMethod>(
      &MyClass::bindFun< static_cast<void(*)(MyClass*,int)>(m) >
    ) );
}

private:

template<auto F>
void bindFun(int x){ (*F)(this,x); }

// to be used like 
x.associateMethod(0,[](MyClass* this_, int x){ this_->method1(x+1); });

(*)可悲的是,這是用clang編譯的,但是gcc拒絕編譯它(我要問一個問題,您可以在這里找到它)。

暫無
暫無

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

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