我有一個lambda,我需要轉換成一個可調用對象,以便我可以專門調用操作符。我的印象一直是與void(auto)
簽名拉姆達相當於一個可調用的結構大致是這樣的:如何在C++中提供可調用的對象保護訪問像lambda?
struct callable {
Foo & capture;
template< typename T >
void operator()(T arg) { /* ... */ }
}
然而,當一個成員函數中聲明的拉姆達可以訪問private和protected成員。
這裏有一個簡單的例子:
#include <iostream>
using namespace std;
class A {
protected:
void a() { cout << "YES" << endl; }
};
class B : public A {
public:
void call1();
void call2();
};
struct callable {
B * mB;
void operator()() {
// This does not compile: 'void A::a()' is protected within this context
// mB->a();
}
};
void B::call1() {
// but then how does this access a() ?!
[&]() { a(); }();
}
void B::call2() {
callable c{ this };
c();
}
int main()
{
B b;
b.call1();
b.call2();
}
有沒有辦法模仿的可調用結構這一行爲,而不在頭聲明,並使其成爲友元類?這似乎有問題,因爲我會有很多不同的可調用的東西。我也只是好奇,因爲我的印象是lambda函數在功能上與使用調用操作符聲明結構相同。
Access rights of a lambda capturing this似乎認爲lambda具有與本地類相同的訪問權限。但在我的情況下,我需要模擬一個通用的lambda,本地類不能有模板成員函數。
「這樣我就可以專門調用操作符」 - 聽起來像是一個糟糕的計劃。爲什麼,你是否願意重新考慮?超載更爲緊張。 – Yakk