ভার্চুয়াল সদস্য ফাংশনগুলির ওভারহেড এড়াতে আমি কীভাবে সিআরটিপি ব্যবহার করতে পারি?
ভার্চুয়াল সদস্য ফাংশনগুলির ওভারহেড এড়াতে আমি কীভাবে সিআরটিপি ব্যবহার করতে পারি?
উত্তর:
দুটি উপায় আছে।
প্রথমটি হ'ল ধরণের কাঠামোর জন্য ইন্টারফেসটি স্থিরভাবে উল্লেখ করে:
template <class Derived>
struct base {
void foo() {
static_cast<Derived *>(this)->foo();
};
};
struct my_type : base<my_type> {
void foo(); // required to compile.
};
struct your_type : base<your_type> {
void foo(); // required to compile.
};
দ্বিতীয়টি হ'ল রেফারেন্স-টু-বেস বা পয়েন্টার-টু-বেস আইডিয়মের ব্যবহার এড়ানো এবং সংকলনের সময় তারগুলি করা। উপরের সংজ্ঞাটি ব্যবহার করে, আপনি টেমপ্লেট ফাংশনগুলি দেখতে পারেন যা দেখতে এর মতো দেখায়:
template <class T> // T is deduced at compile-time
void bar(base<T> & obj) {
obj.foo(); // will do static dispatch
}
struct not_derived_from_base { }; // notice, not derived from base
// ...
my_type my_instance;
your_type your_instance;
not_derived_from_base invalid_instance;
bar(my_instance); // will call my_instance.foo()
bar(your_instance); // will call your_instance.foo()
bar(invalid_instance); // compile error, cannot deduce correct overload
সুতরাং কাঠামো / ইন্টারফেস সংজ্ঞা এবং আপনার ফাংশনগুলিতে সংকলন-টাইপ টাইপ ছাড়ের সংমিশ্রণ আপনাকে গতিশীল প্রেরণের পরিবর্তে স্থিতিশীল প্রেরণ করার অনুমতি দেয়। এটি স্ট্যাটিক পলিমারফিজমের সারাংশ।
template<class T> bar(base2<T> &obj) { obj.quux(); }
- একটি আলাদা bar()
বাস্তবায়ন সহ দ্বিতীয় স্তরের শ্রেণি - এবং সিআরটিপি-র উপযোগিতা স্পষ্ট হয়ে ওঠে।
আমি নিজে সিআরটিপি সম্পর্কে শালীন আলোচনা খুঁজছি। বৈজ্ঞানিক সি ++ এর জন্য টড ভেলদুইজেনের কৌশলগুলি এটি (1.3) এবং এক্সপ্রেশন টেম্পলেটগুলির মতো আরও অনেক উন্নত কৌশল resource
এছাড়াও, আমি দেখতে পেয়েছি যে আপনি কোপলিনের বেশিরভাগ মূল সি ++ রত্ন নিবন্ধ গুগল বইতে পড়তে পারেন। হয়তো এখনও সেই ঘটনা।
dynamic_cast
বা ভার্চুয়াল পদ্ধতিগুলি।
আমাকে সিআরটিপি দেখতে হবে । এটি করার পরেও আমি স্ট্যাটিক পলিমারফিজম সম্পর্কে কিছু জিনিস পেয়েছি । আমি সন্দেহ করি যে এটিই আপনার প্রশ্নের উত্তর।
দেখা যাচ্ছে যে এটিএল এই প্যাটার্নটি বেশ ব্যাপকভাবে ব্যবহার করে।
এই উইকিপিডিয়া উত্তরে আপনার যা যা প্রয়োজন তা রয়েছে। যথা:
template <class Derived> struct Base
{
void interface()
{
// ...
static_cast<Derived*>(this)->implementation();
// ...
}
static void static_func()
{
// ...
Derived::static_sub_func();
// ...
}
};
struct Derived : Base<Derived>
{
void implementation();
static void static_sub_func();
};
যদিও আমি জানি না এটি আসলে আপনাকে কতটা কিনে। ভার্চুয়াল ফাংশন কলের ওভারহেড হ'ল (অবশ্যই সংকলক নির্ভরশীল):
সিআরটিপি স্থির পলিমারফিজমের ওভারহেডটি যখন:
not_derived_from_base
থেকে প্রাপ্ত করা হয় নাbase
, না এটা থেকে উদ্ভূত হয়base
...