C ++ 0x лямбда-оболочки против привязки для проходящего члена functions

Это в основном вопрос о удобочитаемости, стиле, производительности двух разных подходов к созданию / передаче функтора, который указывает на метод-член из конструктора / метода класса.

Подход 1:

using namespace std::placeholders;
std::bind( &MyClass::some_method, this, _1, _2, _3 )

Подход 2:

[ this ](const arg1& a, arg2 b, arg3& c) -> blah { some_method( a, b, c ); }

Мне было интересно если использование лямбда в этой ситуации просто бесполезно, в некоторых отношениях легче увидеть, что происходит, но тогда вы должны явно указать типы arg. Также я предпочитаю не использовать «использование пространства имен без разницы», но тогда это делает выражение привязки излишне подробным (например, _1 становится std :: placeholder :: _ 1), а лямбда позволяет избежать этой проблемы.

Наконец, я должен отметить, что для целей этого вопроса some_method - это большая функция, которая выполняет множество вещей, и было бы больно напрямую скопировать в тело лямбда.

Если этот вопрос кажется слишком расплывчатым, тогда мы можем сосредоточиться на ответах на различия в производительности, если таковые имеются.

РЕДАКТИРОВАТЬ: Нетривиальный вариант использования.

MyClass::MyClass()
:    some_member_( CALLBACK_FUNCTOR )
{}

Как видите, CALLBACK_FUNCTOR, используемый в списке инициализаторов (определенный с подходом 1 или 2), затрудняет определение области действия объявления using (afaik), и, очевидно, мы не стали бы оборачивать метод-член, который мы намеревались вызвать сразу.

11
задан spraff 18 January 2012 в 12:01
поделиться