Разбавляя код SObjectizer-а шаблонной магией наткнулся на странную штуку в VC++12 (который из VS2013). Такое ощущение, что когда вложенность лямбд оказывается достаточно большой и очередная лямбда не захватывает контекст (т.е. может быть конвертирована в обычную функцию), то VC++ в качестве типа лямбды начинает использовать не анонимный класс с operator(), а указатель на функцию с соответствующей сигнатурой. Т.е. тупо конвертирует лямбду в функцию и дальше использует тип этой функции в качестве типа лямбды. Проявилось это вот на такой строчке. Там реально лямбда на лямбде и лямбдой погоняет :)
К счастью, в более новых версиях VC++ уже такого нет, там лямбда остается лямбдой. Надо бы закругляться с поддержкой VC++12.0. Видимо, в 2018 мы перестанем поддерживать этот компилятор в SO-5.
Еще захотелось, чтобы в C++ таки концепты завезли. Ибо набирать такое, наверное, прикольно, но уж больно муторно:
template< typename Method_Pointer > typename std::enable_if< details::is_agent_method_pointer<Method_Pointer>::value, subscription_bind_t & >::type event( Method_Pointer pfn, thread_safety_t thread_safety = not_thread_safe ); |
Хотелось бы один раз определить концепт MethodAsHandler, а потом указывать этот концепт в декларации метода:
subscription_bind_t & event( MethodAsPointer pfn, thread_safety_t thread_safety = not_thread_safe ); |
Осталось каких-то три годика подождать... :)
Комментариев нет:
Отправить комментарий