استفاده از std::ref , std::cref جهت دسترسی به متغییرهای کلاس اتوماتیک تعریف شده در یک تابع به صورت call by reference درزمان استفاده از کلاس اشاره گر تابع std::function

تصور کنید که چند متغیر از نوع int دارید و بطور پیش فرض مقدار اولیه ای هم برای آنها در نظر میگیرید و می خواهید از این متغیرها در یک فانکشن استفاده نمائید.
اگر با استفاده از کلاس std::function یک اشاره گر به تابع بسازید و با استفاده از std::bind پارامترها را هم به فانکشن خود پاس دهید واگر در امضای تابع خود ذکر کرده باشید که مقادیر ورودی با ارجاع باشند، در زمان فراخوانی تابع شما به مقادیر اولیه متغیر ها در زمان تعریف دسترسی خواهید داشت.
حالا تصور کنید که بعد از bind کردن پارامتراها به اشاره گر تابع مقادیر جدید برای متغیرها ست کردید در اینصورت اگر بازهم تابع خود را فراخوانی کنید خواهید دید که فقط به مقادیر اولیه که ست شده بود باز دسترسی خواهد داشت و مقادیر جدید در دسترس تابع نیستند برای رفع این مشکل دوراه وجود دارد.
1- بلافاصله بعد از تغییر مقادیر متغیرها با استفاده از دستور bind مجدد پارامترها را برای اشاره گر تابع ست کنید که خوب در اینصورت اگر 100 بار تغییر در مقادیر داشته باشید از نظر منطقی وبهره وری نرم افزاری کار درستی نیست که 100 بار از bind استفاده کنید.
2- از کلاسهای std::ref برای داده های غیر ثابت و از std::cref برای داده های ثابت می توانید استفاده نمایید.

همانطور که مشاهده میکنید در مثال زیر در زمان تعریف متغیرهای عددی مقداری برایشان ست کرده ایم و بعد با استفاده از function , bind یک اشاره گر به تابع f ساخته ایم که از سه پارامتر این تابع یک پارامتر را با استفاده از رفرنس معمولی پاس داده ام و دو پارامتر را با استفاده از کلاس ref , cref پاس داده ام و در مر حله بعد مقادیر متغیر ها را تغییر داده ام همانطور که انتظار داشتیم درون بدنه تابع من n مقدار پیش فرض را که در زمان تعریف متغیر ایجاد شده بود در دسترس خواهد داشت تغییرات بعدی را نخواهید دید آنهم به این علت که در بالا توضیح داده شد. ولی دو پارامتر بعدی به آخرین مقدار ست شده در متغییر های اتوماتیک دسترسی خواهند داشت.

#include <functional>
#include <iostream>

void f(int& n1, int& n2, const int& n3)
{
std::cout << "In function: " << n1 << ' ' << n2 << ' ' << n3 << '\n';
++n1;
++n2;
// ++n3;
}

int main()
{
int n1 = 1, n2 = 2, n3 = 3;
std::function<void()> bound_f = std::bind(f, n1, std::ref(n2), std::cref(n3));
n1 = 10;
n2 = 11;
n3 = 12;
std::cout << "Before function: " << n1 << ' ' << n2 << ' ' << n3 << '\n';
bound_f();
std::cout << "After function: " << n1 << ' ' << n2 << ' ' << n3 << '\n' << '\n';

n1 = 13;
n2 = 14;
n3 = 15;
std::cout << "Before function: " << n1 << ' ' << n2 << ' ' << n3 << '\n';
bound_f();
std::cout << "After function: " << n1 << ' ' << n2 << ' ' << n3 << '\n';

return 0;
}