2015-07-04 3 views
3

У меня есть интересный случай использования для моего маленького любимого проекта, где я хотел бы иметьМожно ли определить анонимную функцию-член в C++

static map<std::string, pointer-to-member-function> 

в классе. Это легко, если немного громоздкий синтаксис, и он работает красиво.

То, что я хотел бы сделать, также состоит в том, чтобы функция-указатель-член была простым лямбда-выражением в моем статическом инициализаторе. Это сделало бы sooo легким для того чтобы упаковать вещи как это в славном макросе.

Я хочу, чтобы функция-указатель к члену имела доступ к частным членам класса, поэтому я не могу использовать обычную лямбду с «этим» в качестве параметра. Однако я не могу найти способ определить анонимную функцию-член - C++ lambdas кажутся свободными глобальными функциями?

+4

Вы хотите 'std :: map >'? – Jarod42

+1

Нет, это невозможно. Однако вы можете передать экземпляр своего класса в качестве параметра. –

+0

Если вы захватили указатель 'this' в лямбда, он будет вести себя как функция-член. –

ответ

3

Если у вас на карте есть std::function<void(const MyClass&)>, вы можете сохранить лямбда, которая принимает экземпляр вашего класса в качестве параметра. Пока лямбда определяется в функции члена MyClass будет иметь возможность доступа к членам частного класса MyClass:

#include <map> 
#include <functional> 

class MyClass { 
private: 
    void myPrivate() const { } 
public: 
    static std::map<std::string, std::function<void(const MyClass&)>> funcs; 

    static void initFuncs() { 
    funcs["test"] = [](const MyClass& mc) { mc.myPrivate(); }; 
    } 
}; 

std::map<std::string, std::function<void(const MyClass&)>> MyClass::funcs; 

int main() { 
    MyClass::initFuncs(); 
    MyClass mc; 
    MyClass::funcs["test"](mc);  
} 

Live demo.

+0

Ах, поэтому лямбда, определенная внутри класса, неявно становится «дружеской» функцией. Круто. Это будет делать то, что я хочу, и гораздо проще, чем функции-указатели на член. У меня есть с чем работать! –

Смежные вопросы