2012-04-05 8 views
4

Существует ли какой-либо набор инструментов C++ GUI для определения функций обратного вызова в виде лямбда-выражений C++ 11? Я считаю, что это уникальный способ использования C# (по крайней мере, по сравнению с C++) для написания программ на основе графического интерфейса. Какую подпись типа следует использовать для функций, принимающих лямбда-выражения в качестве аргументов, и как они поддерживают неявные преобразования?C++ 11 Лямбда-выражения в качестве функций обратного вызова

+0

Посмотрите на библиотеку _any_ сигналов/слотов, такую ​​как [это] (http://www.boost.org/libs/signals2/) или [это] (http://www.boost.org/ libs/signals /), или [это] (http://www.chaoticmind.net/~hcb/projects/libtscb/). Этот шаблон полностью ортогонален GUI, но графические интерфейсы - это место, где обычно используется шаблон. – ildjarn

ответ

3

ли какие-либо C++ GUI инструментарий вне там определения поддержки обратного вызова функций, как C++ 11 лямбда-выражения?

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

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

Если вы хотите, чтобы люди использовать лямбды или любой вызываемый объект, то вы можете либо иметь свой API принимать объекты станд :: функции, или использовать шаблон:

template<typename Callback> 
void do_it(Callback c) { 
    c(); 
} 

do_it([&]{ c = a+b; }); 

шаблон позволит лямбда в быть встроенным, тогда как std :: function требует косвенности. Это может не иметь особого значения для обратных вызовов GUI.

+12

Любые причины использования орграфов здесь? Кажется излишне запутанным. – juanchopanza

+0

, пожалуйста, избегайте орграфов – dats

6

Ответ на вторую часть вопроса: вы можете использовать std::function<Signature>, где Signature = например. void (int) или - если лямбды не принимают закрытий - старый добрый метод void (Foo*)(int), поскольку лямбда без крышки должна быть конвертирована в соответствующий тип функции. Так, например, вызов метода с подписью:

void AddHandler(std::function<void (int)> const &); 

может выглядеть следующим образом:

myObject.AddHandler([&](int _) { 
    // do something and access captured variables by reference 
}); 
2

Существует новый набор инструментов GUI, который соответствует вашим требованиям. Он пытается предоставить множество функций для повышения эффективности разработки.

Введение в библиотеку. http://nanaproject.wordpress.com/2011/12/16/preliminary-study-of-nana-c-library/

Статья, поясняющая, как уменьшить сложность с помощью библиотеки и std :: bind. http://nanaproject.wordpress.com/2012/01/31/idioms-and-insights-for-a-good-design/

Удачи!

0

С C++ 11 храмовой библиотекой не имеет значения, поддерживает ли GUI lambdas. Вы можете сделать GUI, чтобы делать все, что хотите, с сообщениями и хранить один и тот же код на стороне логики домена. Ознакомьтесь с этой статьей о taming Qt и этих examples.

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