boost::function
operator()
ডান স্বাক্ষরযুক্ত কোনও কিছুকে প্যারামিটারের সাথে আবদ্ধ করার অনুমতি দেয় এবং আপনার বাইন্ডের ফলাফলটিকে প্যারামিটার দিয়ে ডাকা যেতে পারে int
, তাই এটি আবদ্ধ হতে পারে function<void(int)>
।
এটি কীভাবে এটি কাজ করে (এই বিবরণটি একইভাবে প্রযোজ্য std::function
):
boost::bind(&klass::member, instance, 0, _1)
এর মতো একটি বস্তু ফেরত দেয়
struct unspecified_type
{
... some members ...
return_type operator()(int i) const { return instance->*&klass::member(0, i);
}
যেখানে return_type
এবং int
এর স্বাক্ষর থেকে অনুমান করা হয় klass::member
এবং ফাংশন পয়েন্টার এবং সীমাবদ্ধ পরামিতি আসলে বস্তুতে সঞ্চিত থাকে, তবে এটি গুরুত্বপূর্ণ নয়
এখন, boost::function
কোনও ধরণের চেকিং করবেন না: এটি কোনও টেমপ্লেট প্যারামিটারে আপনি সরবরাহ করেছেন এমন কোনও বস্তু এবং কোনও স্বাক্ষর নেবে এবং আপনার স্বাক্ষর অনুসারে কলযোগ্য এবং এমন একটি বস্তু তৈরি করবে যা সেই বস্তুকে কল করে। যদি এটি অসম্ভব, তবে এটি একটি সংকলন ত্রুটি।
boost::function
আসলে এটি এর মতো একটি বিষয়:
template <class Sig>
class function
{
function_impl<Sig>* f;
public:
return_type operator()(argument_type arg0) const { return (*f)(arg0); }
};
যেখানে return_type
এবং argument_type
থেকে উত্তোলন করা হয় Sig
, এবং f
গতিতে গতিতে বরাদ্দ করা হয়। যে বন্ধন বিভিন্ন আকারের সঙ্গে সম্পূর্ণরূপে সম্পর্কহীন বস্তু করার অনুমতি দরকার boost::function
।
function_impl
কেবল একটি বিমূর্ত শ্রেণি
template <class Sig>
class function_impl
{
public:
virtual return_type operator()(argument_type arg0) const=0;
};
যে ক্লাসটি সমস্ত কাজ করে, সেগুলি থেকে প্রাপ্ত একটি কংক্রিট শ্রেণি boost::function
। আপনার অর্পিত প্রতিটি ধরণের অবজেক্টের জন্য একটি রয়েছেboost::function
template <class Sig, class Object>
class function_impl_concrete : public function_impl<Sig>
{
Object o
public:
virtual return_type operator()(argument_type arg0) const=0 { return o(arg0); }
};
এর অর্থ আপনার ক্ষেত্রে, ক্রিয়াকলাপ বাড়ানোর জন্য অ্যাসাইনমেন্ট:
- একটি প্রকার ইনস্ট্যান্ট করে
function_impl_concrete<void(int), unspecified_type>
(অবশ্যই এটি সংকলন সময়)
- হিপে এই ধরণের একটি নতুন অবজেক্ট তৈরি করে
- এই বস্তুটি বুস্ট :: ফাংশনের এফ সদস্যকে বরাদ্দ করে
আপনি যখন ফাংশনটি অবজেক্টকে কল করেন তখন এটি তার প্রয়োগকারী বস্তুর ভার্চুয়াল ফাংশনকে কল করে, যা কলটি আপনার মূল ফাংশনে ডাইরেক্ট করবে।
অস্বীকৃতি: নোট করুন যে এই ব্যাখ্যায় নামগুলি ইচ্ছাকৃতভাবে তৈরি করা হয়েছে। প্রকৃত ব্যক্তি বা চরিত্রগুলির সাথে কোনও সাদৃশ্য ... আপনি এটি জানেন। উদ্দেশ্য ছিল নীতিগুলি বর্ণনা করা।