![](/img/trans.png)
[英]How do I write a C++ requires expression that looks for specific member functions/static functions with arguments?
[英]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.