Что было бы «Привет, мир!» пример для & quot; std :: ref & quot ;?

Может кто-нибудь привести простой пример, который демонстрирует функциональность std::ref? Я имею в виду пример, в котором используются некоторые другие конструкции (такие как кортежи или шаблоны типов данных) только если невозможно объяснить std::ref без них.

Я нашел два вопроса о std::ref Вот а также Вот. Но в первом случае речь идет об ошибке в компиляторе, а во втором — примеры использования std::ref не содержат std::ref и они включают в себя кортежи и шаблоны типов данных, которые усложняют понимание этих примеров.

62

Решение

Вы должны подумать об использовании 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
81

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

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 (но возможно и другое использование).

15

Другим местом, где вам может понадобиться 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. Расширенные возможности блокировки и условные переменные (Баптист Вихт)
) (надеюсь, я правильно сделал атрибуцию)

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