Jaka jest różnica między boost::ref(i)
i & i
? W jakich sytuacjach nie możemy używać zwykłych referencji i zamiast tego musimy przejść na numer boost::ref
? Podaj przykłady, jeśli to możliwe.Różnica między boost :: ref i regularnymi referencjami
Odpowiedz
Celem boost :: reference_wrapper jest zawierają odniesienie do obiektu typu T. Jest wykorzystywany przede wszystkim do „karmić” referencje funkcjonować szablony (algorytmy), które przyjmują swój parametr według wartości.
Uwaga: Istotna różnica między boost::reference_wrapper
i std::reference_wrapper
(przynajmniej uwypuklenia 1,52) jest zdolność std::reference_wrapper
doskonale owinąć obiektów funkcyjnych.
Umożliwia kodu:
// 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';
W Boost.Thread na przykład:
nowy gwint jest uruchamiany przez przekazanie obiektu z żądanie w rodzaju, który może być wywoływane bez parametrów do konstruktora . Obiekt jest następnie kopiowany do pamięci wewnętrznej i wywoływany na nowo utworzony wątek wykonania. Jeśli obiekt nie może być (lub nie może) być skopiowany, to , następnie doładowanie :: ref może być użyte do przekazania obiektu referencyjnego do obiektu . W takim przypadku użytkownik obiektu Boost.Thread musi upewnić się, że określony obiekt o numerze przeżyje nowo utworzony wątek wykonania.
Kod z doc:
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
- 1. różnica między pthread_spinlock i boost :: smart_ptr :: spinlock?
- 2. Jaka jest różnica między `&` a `ref`?
- 3. Czy istnieje różnica między odniesieniami uniwersalnymi a referencjami przekazywania?
- 4. Firebase - Jaka jest różnica między ref i child?
- 5. Jaka jest różnica między Boost :: bind a Boost Phoenix :: bind?
- 6. Jaka jest różnica między boost :: io_service poll_one i run_one?
- 7. Edytuj odległość między dwoma wyrażeniami regularnymi
- 8. Jaka jest różnica między std :: to_string, boost :: to_string i boost :: lexical_cast <std::string>?
- 9. Jaka jest różnica między "mutex" i "lock"?
- 10. Różnica między unwrapObservable i()
- 11. Różnica między "**/* /" i "** /"?
- 12. Różnica między | = i^= css
- 13. Composer.phar różnica między | i ||
- 14. Różnica między "% ~ dp0" i ". \"?
- 15. Różnica między ". +" I ". +?"
- 16. MySQL: Różnica między ",", "i"
- 17. Problemy z biblioteką TFS i referencjami
- 18. Różnica między (++ i) oraz (i ++)
- 19. Różnice między tr1 :: shared_ptr i boost :: shared_ptr?
- 20. Różnica kręgosłupa Różnica między CompositeView i CollectionView?
- 21. Ref parametry i odbicie
- 22. Różnica między logger.info i logger.debug
- 23. Różnica między fgets i fscanf?
- 24. Różnica między NSLog i DLog
- 25. Różnica między RoutedEventHandler i EventHandler
- 26. Różnica między obrysem i wypełnieniem?
- 27. Różnica między Parameters.Add i Parameters.AddWithValue
- 28. Różnica między putback() i unget()
- 29. Różnica między Delegate.BeginInvoke i Thread.Start
- 30. Różnica między TVar i TMVar
@Venkat Shiva: Sytuacja jest „Kiedy algorytmy potrzebne do podjęcia ich przez wartość parametru” i nie chcą ponosić karę wydajność przekazywania obiektu przez wartość . –
Myślę, że powinienem przeczytać dokumentację poprawnie przed wysłaniem pytań. Przepraszam za problem. –