2010-04-01 2 views

ответ

7

От Boost.Ref Documentation:

Цель повышение :: reference_wrapper является содержать ссылку на объект типа T. Это в основном используется для «кормить» ссылки на шаблоны функций (алгоритмы), которые принимают свой параметр по значению.

NB: Важное различие между boost::reference_wrapper и std::reference_wrapper (по крайней мере, повышающего 1.52) является способность std::reference_wrapper идеально обернуть функциональные объекты.

Это позволяет такой код:

// functor that counts how often it was applied 
struct counting_plus { 
    counting_plus() : applications(0) {} 
    int applications; 

    int operator()(const int& x, const int& y) 
    { ++applications; return x + y; } 
}; 

std::vector<int> x = {1, 2, 3}, y = {1, 2, 3}, result; 
counting_plus f; 
std::transform(begin(x), end(x), begin(y), 
       std::back_inserter(result), std::ref(f)); 
std::cout << "counting_plus has been applied " << f.applications 
      << " times." << '\n'; 
+0

@Venkat Шива: Ситуация «Когда алгоритмы должны принимать их параметры по значению», и вы не хотите брать на себя исполнение наказания в виде передачи объекта по значению , –

+0

Я думаю, что я должен правильно прочитать документацию, прежде чем отправлять вопросы. Извините за беспокойство. –

4

В Boost.Thread, например:

Новый поток запускается при пропускании объект отзывной типа, который может быть вызывается без параметров к конструктору . Затем объект копируется во внутреннее хранилище и вызывается на вновь созданный поток выполнения. Если объект не должен (или не может) быть скопирован , то boost :: ref может использоваться для передачи в ссылку на функцию объект. В этом случае пользователь Boost.Thread должен убедиться, что упомянутый объект переживает вновь созданный поток выполнения .

код из дока:

struct callable 
{ 
    void operator()(); 
}; 

boost::thread copies_are_safe() 
{ 
    callable x; 
    return boost::thread(x); 
} // x is destroyed, but the newly-created thread has a copy, so this is OK 

boost::thread oops() 
{ 
    callable x; 
    return boost::thread(boost::ref(x)); 
} // x is destroyed, but the newly-created thread still has a reference 
    // this leads to undefined behaviour 
Смежные вопросы