Передать функторы по значению или по C ++ 11 Universal Reference?

Возможный дубликат:
Должны ли шаблонные функции принимать лямбда-аргументы по значению или по rvalue-ссылке?

Функции стандартной библиотеки C ++ принимают аргументы функтора (указатель на функцию или объект функции) по значению, например:

template <typename F>
void apply(F func)
{
func();
}

…Но не лучше ли передать функторы Универсальная ссылка? Вот так:

template <typename F>
void apply(F&& func)
{
func();
}

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

18

Решение

Это уже имеет место с некоторыми алгоритмами; например, в g++ 4.7.0:

//stl_algo.h

template<typename _RandomAccessIterator, typename _UniformRandomNumberGenerator>
void
shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
_UniformRandomNumberGenerator&& __g)
{
...
}

Очевидно, что это необходимо для таких вещей, как генераторы случайных чисел. Я полагаю, что со временем это станет чем-то более распространенным.

8

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]