Что бы это было " Здравствуй, Мир!"пример для "std:: ref"?



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



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

646   3  

3 ответов:

вы должны думать об использовании std::ref когда функция:

  • принимает параметр шаблона, стоимостью
  • или копирует / перемещает a параметр ссылки переадресации, например 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: расширенные переменные блокировки и условия (Baptiste Wicht) ) (надеюсь, что я сделал атрибуцию правильно)

Comments

    Ничего не найдено.