Может кто-нибудь привести простой пример, который демонстрирует функциональность std::ref
? Я имею в виду пример, в котором используются некоторые другие конструкции (такие как кортежи или шаблоны типов данных) только если невозможно объяснить std::ref
без них.
Я нашел два вопроса о std::ref
Вот а также Вот. Но в первом случае речь идет об ошибке в компиляторе, а во втором — примеры использования std::ref
не содержат std::ref
и они включают в себя кортежи и шаблоны типов данных, которые усложняют понимание этих примеров.
Вы должны подумать об использовании std::ref
когда функция:
std::bind
или конструктор для std::thread
.std::ref
это тип значения, который ведет себя как ссылка.
Этот пример демонстрирует очевидное использование std::ref
,
#include <iostream>
#include <functional>
void increment( int &x )
{
++x;
}
int main()
{
int i = 0;
// Here, we bind increment to (a copy of) i...
std::bind( increment, i ) ();
// ^^ (...and invoke the resulting function object)
// i is still 0, because the copy was incremented.
std::cout << i << std::endl;
// Now, we bind increment to std::ref(i)
std::bind( increment, std::ref(i) ) ();
// i has now been incremented.
std::cout << i << std::endl;
}
Выход:
0
1
void PrintNumber(int i) {...}
int n = 4;
std::function<void()> print1 = std::bind(&PrintNumber, n);
std::function<void()> print2 = std::bind(&PrintNumber, std::ref(n));
n = 5;
print1(); //prints 4
print2(); //prints 5
std::ref
в основном используется для инкапсуляции ссылок при использовании std::bind
(но возможно и другое использование).
Другим местом, где вам может понадобиться std :: ref, является передача объектов потокам, где вы хотите, чтобы каждый поток работал с единственным объектом, а не с копией объекта.
int main(){
BoundedBuffer buffer(200);
std::thread c1(consumer, 0, std::ref(buffer));
std::thread c2(consumer, 1, std::ref(buffer));
std::thread c3(consumer, 2, std::ref(buffer));
std::thread p1(producer, 0, std::ref(buffer));
std::thread p2(producer, 1, std::ref(buffer));
c1.join();
c2.join();
c3.join();
p1.join();
p2.join();
return 0; }
где вы хотите, чтобы различные функции, работающие в разных потоках, совместно использовали один буферный объект. Этот пример был украден из этого отличного урока ( Учебник по параллелизму C ++ 11 — Часть 3. Расширенные возможности блокировки и условные переменные (Баптист Вихт)
) (надеюсь, я правильно сделал атрибуцию)