Что бы это было " Здравствуй, Мир!"пример для "std:: ref"?
может кто-нибудь дать простой пример, который демонстрирует функциональность std::ref? Я имею в виду пример, в котором используются некоторые другие конструкции (например, кортежи или шаблоны типов данных)только если невозможно объяснить std::ref без них.
я нашел два вопроса о std::refздесь и здесь. Но в первом речь идет об ошибке в компиляторе, а во втором-примеры использования std::ref не содержат std::ref и они включают кортежи и шаблоны типов данных, которые делают понимание этих примеров сложным.
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