2013-05-09 3 views
2

Я смущен насчет использования boost :: ref. Я не понимаю, почему любой хотел бы сделать следующее -Использование boost :: ref для передачи ссылки на функции, которые принимают значения

void f(int x) 
{ 
    cout << x<<endl; 
    x++; 
} 

int main(int argc, char *argv[]) 
{ 
    int aaa=2; 
    f(boost::ref(aaa)); 
    cout << aaa<<endl; 
    exit(0); 
} 

Какая польза прохождения реф к функции. Я всегда могу передать значение. И это не то, что ref фактически передается. В приведенном выше значении aaa в основном остается 2.

Где именно ускорение ref полезно?

Можно ли использовать boost :: ref в этом сценарии. Я хочу передать итератор refernce в std :: sort. обычно сортировка работает на копиях итератора - будет увеличиваться :: ref заставляет работать и для ссылок? (без каких-либо изменений в std :: sort)

ответ

11

Я не понимаю, почему любой хотел бы сделать следующее

они не будут. Это не то, что boost::ref (или в эти дни std::ref) для. Если функция принимает аргумент по значению, тогда нет способа заставить его взять его по ссылке вместо этого.

Где именно ускорение ref полезно?

Он может быть использован, чтобы сделать функцию шаблона действовать, как будто он принимает аргумент в качестве ссылки, путем обработки шаблона для справки (обертки) типа, а не тип значения:

template <typename T> 
void f(T x) {++x;} 

f(aaa);  cout << aaa << endl; // increments a copy: prints 0 
f(ref(aaa)); cout << aaa << endl; // increments "a" itself: prints 1 

Обычного конкретное использования для связывания аргументов функций:

void f(int & x) {++x;} 

int aaa = 0; 
auto byval = bind(f, aaa);  // binds a copy 
auto byref = bind(f, ref(aaa)); // binds a reference 

byval(); cout << aaa << endl; // increments a copy: prints 0 
byref(); cout << aaa << endl; // increments "a" itself: prints 1 

можно ли использовать импульс :; ref в этом сценарии. Я хочу передать iterator refernce в std :: sort. обычно сортировка работает на копиях итератора - будет увеличиваться :: ref заставляет работать и для ссылок?

Нет; эталонная оболочка не соответствует требованиям итератора, поэтому вы не можете использовать ее в стандартных алгоритмах. Если бы вы могли, то многие алгоритмы были бы ужасно ошибочными, если бы им нужно было создавать независимые копии итераторов (как это делают многие, включая большинство реализаций sort).

+0

oki понять, но вы можете объяснить, как это работает. template void f (_T x) {x ++; } int main (int argc, char * argv []) {int aaa = 2; f > (boost :: ref (aaa)); cout << aaa <> aaa; Выход (0); } Значение напечатано 3. Не понимаю, как функция x i стала ссылкой? – Rohit

+0

@ user2161003: Явным образом выписывая часть 'reference_wrapper' (что необязательно), вы ответили на свой собственный вопрос: шаблон создается экземпляром типа« ссылочная оболочка »(возвращается' ref() '), и это действует как ссылка на переменную, которую она обертывает. –

+1

но как? и объект reference_wrapper не имеет оператора ++. как работает x ++? – Rohit

-1

Вы прочитали documentation?

Он говорит:

Библиотека Ссылка небольшая библиотека, которая является полезной для передачи ссылки на шаблоны функций (алгоритмов), которые обычно берут копии своих аргументов.

В первом примере, void f(int) не шаблон функции, так что нет никакого эффекта: анонимный временный boost::reference_wrapper<int> создается и сразу же преобразуется обратно в int&, который затем разыменовано пройти int вашей функции. Надеюсь, компилятор отбросит всю эту глупость, так как она не имеет никакого эффекта.

Вы говорите:

... Я всегда могу передать по значению вместо этого.

Это правда, но они делают разные вещи. Передача по ссылке:

  • избегает копию, которая, вероятно, бессмысленно для целых чисел, но полезно для больших или дорогих в копии объектов
  • позволяет звонящему видеть то, что называется функция сделал с аргументом , Это, вероятно, не будет полезным для std::sort, но в целом позволяя вход-выход параметры могут быть полезными

Это может позволитьstd::sort действовать на ссылках итератора, избегая копию (хотя итераторы, как правило, cheap- все-таки копировать типы значений), но я не пробовал. Если вы думаете, что это вам поможет, почему бы не попробовать и не увидеть?

 Смежные вопросы

  • Нет связанных вопросов^_^