std::reference_wrapper
টেমপ্লেটগুলির সাথে সংমিশ্রণে দরকারী। এটি কোনও পয়েন্টারটিকে এটিতে পয়েন্টার সংরক্ষণ করে পুনরায় নিয়োগের জন্য এবং অনুলিপি করার সময় তার স্বাভাবিক শব্দার্থবিজ্ঞানের অনুকরণের সময়কে আবদ্ধ করে। এটি নির্দিষ্ট গ্রন্থাগার টেমপ্লেটগুলিকে বস্তুর পরিবর্তে রেফারেন্স সঞ্চয় করার নির্দেশ দেয়।
এসটিএলে থাকা অ্যালগরিদমগুলি বিবেচনা করুন যা ফান্ট্যাক্টরদের অনুলিপি করে: আপনি কেবল ফান্টারের পরিবর্তে ফান্টারের সাথে উল্লেখ করে একটি রেফারেন্স ਰੈਪਰটি পাস করে সেই অনুলিপিটি এড়াতে পারবেন:
unsigned arr[10];
std::mt19937 myEngine;
std::generate_n( arr, 10, std::ref(myEngine) );
এটি কাজ করে কারণ ...
… reference_wrapper
এর ওভারলোডoperator()
যাতে তারা ফাংশন অবজেক্টগুলির মতো ঠিক তেমন কল করা যায়:
std::ref(myEngine)()
… (আনইন) সাধারণ রেফারেন্সগুলির মতো, অনুলিপি করা (এবং কার্যবিবরণ করা) reference_wrappers
কেবলমাত্র পয়েন্টিকে নির্ধারিত করে।
int i, j;
auto r = std::ref(i);
r = std::ref(j);
r = std::cref(j);
একটি রেফারেন্স র্যাপার অনুলিপি করা কার্যত পয়েন্টার অনুলিপি করার সমতুল্য, এটি যতটা সস্তা cheap সমস্ত ফাংশন এটি ব্যবহারের অন্তর্নিহিত কলগুলি (উদাহরণস্বরূপ যা operator()
তারা এক-লাইনার হিসাবে ঠিক তেমনভাবে ইনলাইন করা উচিত)।
reference_wrapper
গুলি এর মাধ্যমে তৈরি হয় std::ref
এবংstd::cref
:
int i;
auto r = std::ref(i);
auto r2 = std::cref(i);
টেমপ্লেট আর্গুমেন্ট উল্লেখ করা বস্তুর প্রকার এবং সিভি-যোগ্যতা নির্দিষ্ট করে; r2
এটিকে বোঝায় const int
এবং কেবলমাত্র একটি রেফারেন্স দেবে const int
। এর const
মধ্যে ফ্যান্টরস সহ মোড়ক রেফারেন্সের কলগুলি কেবল const
সদস্য ফাংশনকে কল করবে operator()
।
মান সূচনাকারীদের অনুমতি দেওয়া হয় না, কারণ এগুলি অনুমতি দেওয়া ভালের চেয়ে আরও বেশি ক্ষতি করতে পারে। যেহেতু মূলমালা যেভাবেই সরানো হবে (এবং গ্যারান্টিযুক্ত অনুলিপি সহ এমনকি এটি আংশিকভাবে এড়ানো হয়েছে), তাই আমরা শব্দার্থবিজ্ঞানের উন্নতি করি না; আমরা যদিও ঝুঁকিপূর্ণ পয়েন্টারগুলি পরিচয় করিয়ে দিতে পারি, যেমন একটি রেফারেন্স র্যাপার পয়েন্টটির জীবনকাল বাড়ায় না।
লাইব্রেরি ইন্টারঅ্যাকশন
পূর্বে উল্লিখিত হিসাবে, যে make_tuple
কোনও tuple
দ্বারা সম্পর্কিত যুক্তিটি পাস করে ফলাফলের মধ্যে একটি রেফারেন্স সঞ্চয় করার নির্দেশ দিতে পারে reference_wrapper
:
int i;
auto t1 = std::make_tuple(i);
auto t2 = std::make_tuple(std::ref(i));
নোট করুন যে এটি থেকে কিছুটা পৃথক forward_as_tuple
: এখানে, আর্গুমেন্ট হিসাবে মূল্যগুলি অনুমোদিত নয়।
std::bind
একই আচরণ দেখায়: এটি যুক্তির অনুলিপি করবে না তবে এটি যদি একটি রেফারেন্স সঞ্চয় করে reference_wrapper
। কার্যকর যদি সেই যুক্তিটি (বা ফান্টেক্টর!) অনুলিপি করা না প্রয়োজন তবে- bind
ফান্টর ব্যবহার করার সময় স্কোপে থাকে ।
সাধারণ পয়েন্টার থেকে পার্থক্য
সিনট্যাক্টিকাল ইন্ডায়ারেশনের কোনও অতিরিক্ত স্তর নেই। পয়েন্টারগুলিকে তারা যে বস্তুটি উল্লেখ করে তার লভ্যালু অর্জনের জন্য উপযুক্ত হতে হবে; reference_wrapper
এর একটি অন্তর্নিহিত রূপান্তর অপারেটর রয়েছে এবং তাদের মোড়ানো বস্তুর মতো বলা যেতে পারে।
int i;
int& ref = std::ref(i);
reference_wrapper
s, পয়েন্টারগুলির বিপরীতে, নাল অবস্থা নেই। সেগুলি রেফারেন্স বা অন্য কোনওreference_wrapper
দিয়ে শুরু করতে হবে ।
std::reference_wrapper<int> r;
একটি সাদৃশ্য হ'ল অগভীর অনুলিপি শব্দার্থক: পয়েন্টার এবং reference_wrapper
গুলি পুনরায় নিয়োগ দেওয়া যেতে পারে।
.
পরিবর্তে ব্যবহার করেন->