Это C ++, а не Java, поэтому написание C ++, подобного Java, не будет работать хорошо.
В любом случае, вы можете создать функцию адаптера.Предположим, что
typedef int ActionEvent; // <-- just for testing
class ActionListener
{
public:
virtual void actionPerformed(const ActionEvent& event) = 0;
};
Тогда мы могли бы написать шаблонный подкласс ActionListener, который оборачивает объект функции:
#include <memory>
template <typename F>
class ActionListenerFunctor final : public ActionListener
{
public:
template <typename T>
ActionListenerFunctor(T&& function)
: _function(std::forward<T>(function)) {}
virtual void actionPerformed(const ActionEvent& event)
{
_function(event);
}
private:
F _function;
};
template <typename F>
std::unique_ptr<ActionListenerFunctor<F>> make_action_listener(F&& function)
{
auto ptr = new ActionListenerFunctor<F>(std::forward<F>(function));
return std::unique_ptr<ActionListenerFunctor<F>>(ptr);
}
, а затем использовать make_action_listener
для переноса лямбда-выражения, например (http://ideone.com/SQaLz).
#include <iostream>
void addActionListener(std::shared_ptr<ActionListener> listener)
{
ActionEvent e = 12;
listener->actionPerformed(e);
}
int main()
{
addActionListener(make_action_listener([](const ActionEvent& event)
{
std::cout << event << std::endl;
}));
}
Обратите внимание, что это далеко от идиоматического C ++, где в addActionListener()
вам просто нужно взять const std::function<void(const ActionEvent&)>&
или даже параметр шаблона для максимальной эффективности и указать лямбдунепосредственно.