একটি টেম্পলেট শ্রেণি এবং শ্রেণীর টেম্পলেটগুলির মধ্যে পার্থক্য কী?
উত্তর:
এটি অনেকের জন্যই বিভ্রান্তির একটি সাধারণ বিষয় (উইকিপিডিয়ায় জেনেরিক প্রোগ্রামিং পৃষ্ঠা, কিছু সি ++ টিউটোরিয়াল এবং এই পৃষ্ঠায় অন্যান্য উত্তর সহ)। যতদূর সি ++ এর সাথে সম্পর্কিত, "টেম্পলেট শ্রেণি" বলে কিছুই নেই, সেখানে কেবল একটি "শ্রেণীর টেম্পলেট" রয়েছে। এই বাক্যাংশটি পড়ার উপায়টি "ফাংশনের টেম্পলেট" এর বিপরীতে "শ্রেণীর জন্য একটি টেম্পলেট", যা "কোনও ফাংশনের টেম্পলেট"। আবার: ক্লাসগুলি টেমপ্লেট সংজ্ঞায়িত করে না, টেম্পলেটগুলি ক্লাসগুলি (এবং ফাংশন) সংজ্ঞায়িত করে । উদাহরণ হিসেবে বলা যায়, এই একটি হল টেমপ্লেট , নির্দিষ্টভাবে একটি বর্গ টেমপ্লেট কিন্তু এটা না একটি বর্গ :
template<typename T> class MyClassTemplate
{
...
};
ঘোষণাটি কোনও টেম্পলেট ভিত্তিক MyClassTemplate<int> একটি শ্রেণি, বা পেডেন্টালি। কোনও টেম্পলেট ভিত্তিক কোনও টেম্পলেট ভিত্তিক কোনও শ্রেণীর কোনও বিশেষ বৈশিষ্ট্য নেই। বিশেষ বৈশিষ্ট্যগুলি টেমপ্লেটের নিজস্ব ।
"টেমপ্লেট শ্রেণি" শব্দটির অর্থ কিছুই নেই, কারণ "টেমপ্লেট" শব্দের বিশেষণ হিসাবে কোনও অর্থ নেই যখন "C "+ অবধি C ++ এর সাথে যুক্ত হয়। এটা একটা অস্তিত্ব বোঝা বর্গ যে হয় (অথবা সংজ্ঞায়িত) একটি টেমপ্লেট , যা একটি ধারণা যে সি ++ বিদ্যমান নয়।
আমি সাধারণ বিভ্রান্তিটি বুঝতে পারি, কারণ এটি সম্ভবত এই সত্যটির উপর ভিত্তি করে তৈরি হয়েছে যে শব্দগুলি প্রকৃত ভাষায় "টেম্পলেট শ্রেণি" ক্রমে প্রদর্শিত হয়, যা সম্পূর্ণ অন্য একটি গল্প।
সি ++ এর স্রষ্টা বজর্ন স্ট্রস্ট্রপ তাঁর বই দ্য সি ++ প্রোগ্রামিং ল্যাঙ্গুয়েজ ৪ র্থ সংস্করণে বলেছেন , ২৩.২.১ একটি টেমপ্লেট সংজ্ঞায়িত:
শ্রেণি টেম্পলেট এবং টেমপ্লেট শ্রেণীর শর্তগুলির মধ্যে অর্থপূর্ণ পার্থক্য তৈরি করার মতো লোক রয়েছে । আমি না; এটি খুব সূক্ষ্ম হবে: দয়া করে এই পদগুলিকে বিনিময়যোগ্য বিবেচনা করুন। একইভাবে, আমি ফাংশন টেম্পলেটটিকে টেমপ্লেট ফাংশনের সাথে বিনিময়যোগ্য বিবেচনা করি ।
পার্থক্যটি হ'ল "টেমপ্লেট শ্রেণি" শব্দটি কেবল সি ++ স্ট্যান্ডার্ডে নেই। এটি একটি শব্দটি বেশিরভাগ লোকেরা ব্যবহার করে যা মনে করে যে "ক্লাস টেম্পলেট" শব্দটি বিভ্রান্তিকর (যেমন Qt সংস্থাগুলি নোকিয়া এবং পূর্বে ট্রোলটেকের মতো)।
স্ট্যান্ডার্ডটির এটির কোনও ধারণা নেই, তাই এটি অন্য ব্যক্তির উপর নির্ভর করে একটি পার্থক্য করা। কিছু লোক এটি সমার্থকভাবে ব্যবহার করে এবং অন্যরা বলে যে "টেমপ্লেট শ্রেণি" শব্দটি একটি তাত্ক্ষণিক বা স্পষ্টতই বিশেষায়িত শ্রেণিবদ্ধ টেম্পলেট বোঝায়, যা এটি "শ্রেণীর টেম্পলেট বিশেষায়নের" শব্দের সমতুল্য হয়ে উঠত। Icallyতিহাসিকভাবে, এর অর্থ ছিল। সটীক রেফারেন্স ম্যানুয়াল পৃষ্ঠা 343 এ সংজ্ঞায়িত
শ্রেণীর টেম্পলেট থেকে উত্পন্ন শ্রেণীর নামটিকে একটি টেম্পলেট শ্রেণি বলা হয়, যেমন একটি শ্রেণি যেমন নির্দিষ্টভাবে একটি টেম্পলেট-শ্রেণীর নাম দিয়ে তার নাম হিসাবে সংজ্ঞায়িত করা হয়
নন-টার্মিনাল টেম্পলেট-শ্রেণি-নামটি আজকের স্ট্যান্ডার্ডে ব্যবহৃত নন-টার্মিনাল টেম্পলেট-আইডি সমতুল্য এবং নেমে আসে template-name < arguments >।
আপনাকে আজকের শর্তগুলির সাথে পরিচিত করতে, যা সন্দেহজনক পুরাতন পদগুলির ব্যবহারের চেয়ে বেশি গুরুত্বপূর্ণ
// (1) defines a class template
template<typename T> class A { };
// (2) defines a class template explicit specialization
template<> class A<int> { };
// (3) defines a class template partial specialization
template<typename T> class A<T*> { };
// (4) explicitly instantiates A<char>.
template class A<char>;
// (5) implicitly instantiates A<short> (because of the member declaration)
struct D { A<short> a; };
একটি টেম্পলেট শ্রেণি টেম্পলেট পদ্ধতি নকশার প্যাটার্নের সাথে সম্পর্কিত , যখন শ্রেণি টেম্পলেটটি কেবল "ফিলি-ইন-দ্য ব্ল্যাকস" শ্রেণির টেম্পলেট।
ক্লাস টেম্পলেট হ'ল একটি টেম্পলেট যা শ্রেণি তৈরি করতে ব্যবহৃত হয় যখন একটি টেম্পলেট শ্রেণি একটি শ্রেণি যা কোনও টেম্পলেট দ্বারা উত্পাদিত হয়।
টেমপ্লেট শ্রেণি: জেনেরিক সংজ্ঞা বা ক্লায়েন্টের দ্বারা তথ্য সরবরাহ না করা অবধি তড়িঘড়ি করা হয়নি এমন প্যারামিটার সহ একটি বর্গ। এটি প্লেইন টেম্পলেটগুলির জন্য একটি জার্গন হিসাবে উল্লেখ করা হয় pre উপসর্গ টেম্পলেট এবং টি ব্যবহারের জন্য কেবল ক্লাস। শ্রেণীর টেম্পলেট: শ্রেণীর স্বতন্ত্র নির্মাণ একটি শ্রেণি টেম্পলেট দ্বারা নির্দিষ্ট করা হয় যা শ্রেণীর ব্যবহার করে পৃথক বস্তুগুলি কীভাবে তৈরি করা হয় তার প্রায় অনুরূপ। এটি টেমপ্লেট শ্রেণীর একটি বিষয়কে উল্লেখ করা হয় প্রাক্তন-শ্রেণীর নাম অবজেক্টনাম (যুক্তি তালিকা)
ক্লাস টেম্পলেট বিভিন্ন ধরণের অবজেক্টের জন্য জেনেরিক শ্রেণি। মূলত এটি পরামিতিগুলির উপর ভিত্তি করে শ্রেণি উত্পন্ন করার জন্য একটি স্পেসিফিকেশন সরবরাহ করে। যখনই কোনও নতুন অবজেক্ট তৈরি করা হবে তখনই সেই উদ্দেশ্যে স্মৃতিতে একটি নতুন শ্রেণি অনুষ্ঠিত হবে। একে ক্লাস টেম্পলেট ইনস্ট্যান্টিয়েটিং বলা হয় এবং ক্লাসের প্রতিটি ইনস্ট্যান্টিয়েটেড সংস্করণকে টেমপ্লেট শ্রেণি বলা হয়।
এই কাগজটি একবার দেখুন (ডাব্লুজি 21 থেকে এবং 1992 সালে প্রকাশিত হয়েছিল) :
ধারাবাহিক পরিভাষা
আজ অবধি বেশিরভাগ যুক্তি ও মতবিরোধ, টেমপ্লেটগুলি বর্ণনা করার অধ্যায়ে ব্যবহৃত পরিভাষার সাথে সম্পর্কিত হয়েছে। প্রায়শই বিভিন্ন ধারণা এবং অভিপ্রায় প্রকাশ করতে 'ফাংশন-টেম্পলেট' এবং 'টেমপ্লেট-ফাংশন' এর বিভিন্ন প্রয়োগ application যেহেতু কোনও ধারাবাহিক নামকরণ প্রয়োগ করা হয়নি, ফলাফলটি বিভ্রান্তি এবং যুক্তি is
এই নথির উদ্দেশ্যগুলির জন্য, টেমপ্লেটগুলি সম্পর্কে আলোচনায় এবং ডকুমেন্টেশনকে স্পষ্ট করার উদ্দেশ্যে কমিটির দ্বারা আনুষ্ঠানিকভাবে গ্রহণের প্রস্তাব হিসাবে; আমি প্রস্তাব দিচ্ছি যে আমরা আনুষ্ঠানিককরণ গ্রহণ করি, যে একটি 'টেম্পলেট' একটি টেম্পলেট দ্বারা বর্ণিত ধরণের বা ফাংশনগুলির একটি সেট বর্ণনা করে। এবং যে একটি নেতৃস্থানীয় 'template-' , একটি অংশ এর টেমপ্লেট সংজ্ঞা বর্ণনা করার জন্য ব্যবহার করা হয় '-template' যেমন একটি হিসাবে,
'template-member-function'। এভাবে: -
- 'ফাংশন-টেম্পলেট': কোনও টেমপ্লেট দ্বারা বর্ণিত ফাংশনগুলির একটি সেট, সেই ধরণের টেমপ্লেটের আর্গুমেন্ট হিসাবে সরবরাহ করা কিছু ধরণের তথ্যের উপর প্যারাম্যাট্রিক। উদাহরণ স্বরূপ :-
template<class T> int nullcheck( T* pT )
{ return ( pT != 0 ); }
- 'শ্রেণী-টেম্পলেট': কোনও টেমপ্লেট দ্বারা বর্ণিত শ্রেণীর একটি সেট, সেই টেমপ্লেটের আর্গুমেন্ট হিসাবে সরবরাহ করা কিছু ধরণের তথ্যের উপর প্যারাম্যাট্রিক। উদাহরণ স্বরূপ :-
template<class T> class S {
int i;
public:
int sep_member();
int imm_member()
{ return 2; }
}
- 'টেমপ্লেট-ফাংশন': এই পদটির আর অনুমতি নেই * **
'টেমপ্লেট-শ্রেণি': এই শব্দটির অনুমতি নেই * **
'সদস্য-ফাংশন-টেম্পলেট': এই পদটি অনুমোদিত নয়, কারণ এটি এমন কোনও সম্পত্তি বর্ণনা করে যা বর্তমানে টেম্পলেট সংজ্ঞা দ্বারা সমর্থিত নয়। উপরোক্ত পরিভাষা সম্মেলনটি ব্যবহার করে এটি একটি অ-শ্রেণি-টেম্পলেট সদস্যের বর্ণনা দেবে, যার সংজ্ঞা নিজেই একটি টেম্পলেট ছিল। উদাহরণ স্বরূপ :-
class Normal { public:
template<class T> int foo(T*pT)
{ return ( pT == 0 ); }
};
তবে, যেহেতু টেমপ্লেটগুলি বর্তমানে বিশ্বব্যাপী সীমাবদ্ধ, তাই এই জাতীয় টেমপ্লেটটি অবৈধ।
- 'টেমপ্লেট-স্ট্যাটিক-সদস্য-ফাংশন':
- 'টেমপ্লেট-সদস্য-ফাংশন':
- 'টেমপ্লেট-স্ট্যাটিক-সদস্য':
- 'টেমপ্লেট-স্ট্যাটিক-ডেটা-সদস্য ' টেম্পলেট-সদস্য ': কোনও সদস্যের সংজ্ঞার জন্য বিকল্প শর্ত' শ্রেণি-টেম্পলেট 'এর সাথে পৃথক উপস্থিত যা এর সাথে সম্পর্কিত। উদাহরণ স্বরূপ :-
template<class T> int S<T>::sep_member()
{ return i; }
Normalআপনি উপরে বর্ণিত শ্রেণীর সম্পর্কে : আমি জানতাম না যে এই জাতীয় সদস্য-ফাংশন-টেম্পলেট নিষিদ্ধ ছিল। আমার চেষ্টা করা সমস্ত সংকলক এটি গ্রহণ করেছে। আমি কী মিস করছি?