Фактически, переменные commit и m_persons захватываются по ссылке и передаются как параметры статического метода, тело которого находится между макросами.
Есть идея применить похожий подход для иммитации замыканий. Вместо деструктора тогда будет задаваться оператор().
CLOSURE(int, (int i)(int j), (a)(b), (x)(y) )
{
// myFunction - имя перменной, int(int i, int j) - сигнатура.
// допустим, a, b - захват по ссылке, x, y - по значению.
...
} CLOSURE_END(myFunction)
Возникнет следующая трудность: шаблоны нельзя параметризовать локальными классами. Т.е. в std::for_each нельзя будет передать myFunction, если она типа локального класса (хотя в MSVC можно).
Однако, проблема вроде решима. Структуру, хранящую ссылки на параметры, можно заменить на boost::tuple. Вложенный класс со статическим методом остаётся, но переменная myFunction не этого класса, а не-локального шаблонного класса. этот не-локальный шаблонный класс содержит три шаблонных параметра: сигнатура, tuple c параметрами и статический метод локального класса. Типа так:
typedef struct сгенерированное_имя1 {
typedef detail::closure_functor<
R (формальные параметры), // тип оператора()
boost::tuple<заxваченные>,
R Body( формальные параметры, заваченные )
> functor_t;
R Body( формальные параметры, заваченные )
{ код между макросами }
} сгенерированное_имя2;
сгенерированное_имя2::functor_t myFunction(сгенерированное_имя2::Body, конструктор_тупла);
Т.е. сам локальный класс в шаблонах не используется.
Есть ли какие-либо очевидные проблемы (кроме сложности реализации) ? Кто-нибудь пробовал такое реализовать ?
AG>Фактически, переменные commit и m_persons захватываются по ссылке и передаются как параметры статического метода, тело которого находится между макросами.
AG>Есть идея применить похожий подход для иммитации замыканий. Вместо деструктора тогда будет задаваться оператор().
Собственно, это обсуждалось во время review библиотеки, посмотри в списке рассылки.
Как обычно, Стивен Ватанабе пришел с совершенно безумными решениями, Александреску отдыхает
Алекс Насонов сейчас как раз и работает над тем, чтобы сделать полноценную библиотеку с замыканиями и локальными функциями.
Так что если тебя эта тема интересует, можешь поговорить с ним непосредственно.
Здравствуйте, jazzer, Вы писали:
J>Собственно, это обсуждалось во время review библиотеки, посмотри в списке рассылки. J>Как обычно, Стивен Ватанабе пришел с совершенно безумными решениями, Александреску отдыхает
Нашёл обсуждение замыканий, но безумных решений Стивена не увидел.
Есть ли вообще удобный способ искать по этим рассылкам ?
J>Алекс Насонов сейчас как раз и работает над тем, чтобы сделать полноценную библиотеку с замыканиями и локальными функциями. J>Так что если тебя эта тема интересует, можешь поговорить с ним непосредственно.
Здравствуйте, Alexander G, Вы писали:
AG>Есть ли вообще удобный способ искать по этим рассылкам ?
боюсь, что нету.
Это тебе не RSDN
AG>Нашёл обсуждение замыканий, но безумных решений Стивена не увидел.
Ну вот, например.
Одна из самых безумных вещей в С++, которые я видел: http://article.gmane.org/gmane.comp.lib.boost.devel/168837/
На всякий случай приведу код здесь, помедитируй над ним, прежде чем читать разъяснение — получишь большое интеллектуальное удовольствие
Здравствуйте, jazzer, Вы писали:
J>На всякий случай приведу код здесь, помедитируй над ним, прежде чем читать разъяснение — получишь большое интеллектуальное удовольствие
Там спойлер в комментариях в main, но всё равно удовольствие получил