Почему std :: bind1st можно считать «почти непригодным для использования»? - PullRequest
4 голосов
/ 07 июля 2011

Во время разговора по boost::bind было отмечено, что * C 100 03 * существует в C ++ 03, но это «почти непригодно».

Я не могу найти ничего твердого, чтобы поддержать этоup.

Документация boost::bind гласит:

boost :: bind является обобщением стандартных функций std :: bind1st и std :: bind2nd .Он поддерживает произвольные объекты функций, функции, указатели функций и указатели на функции-члены и способен связывать любой аргумент с конкретным значением или направлять входные аргументы в произвольные позиции. bind не предъявляет никаких требований к функциональному объекту;в частности, он не нуждается в result_type , first_argument_type и second_argument_type стандартных typedefs.

, возможно, предполагает, что эти ограничения do применимо к std::bind1st.

Кроме очевидного ограничения количества аргументов, чем являются преимуществами от boost::bind до std::bind1st / std::bind2nd?Есть ли смысл утверждать, что std::bind1st «почти непригоден» в C ++ 03?

Ответы [ 2 ]

7 голосов
/ 07 июля 2011

Если мы посмотрим на C ++ 03 20.3.6.1 и 20.3.6.2, то увидим, что для аргумента функтора bind1st у нас есть требование трех typedef с (для типа результата, первого и второго аргумент), и что результирующий оператор принимает только один аргумент.

Это означает, что мы не можем просто использовать bind1st просто для простых указателей на функции, поскольку у них нет этих typedef s. Также мы можем использовать bind1st только для двоичных функций, так как у нас нет поддержки для большего количества параметров. Более того, boost::bind и др. имеют преимущество в том, что могут изменять порядок параметров и, конечно, поддерживать больше, чем просто первый.

Мне кажется, что в большинстве случаев связыватель предназначен для свободных функций и функций-членов, а не для объектов-функторов; поэтому использование bind1st весьма ограничено (хотя и расширяется за счет использования других инструментов, таких как ptr_fun, но сомнительно, делает ли это его более удобным). Конечно, это только на основе личного опыта, но кто-то может захотеть сделать статистику поиска кода Google для bind1st.

2 голосов
/ 07 июля 2011

Оператор вызова функции типа, который возвращает bind1st, имеет вид

typename Operation::result_type
operator()(const typename Operation::second_argument_type& x) const;

Это не будет работать с опорными параметрами объекта связанной функции и очень строгим компилятором C ++ 03 (более позднийрелизы более слабые).C ++ 03 запрещает ссылки на ссылки.

...