একটি টেম্পলেট শ্রেণি এবং শ্রেণীর টেম্পলেটগুলির মধ্যে পার্থক্য কী?


88

একটি টেম্পলেট শ্রেণি এবং শ্রেণীর টেম্পলেটগুলির মধ্যে পার্থক্য কী?

উত্তর:


127

এটি অনেকের জন্যই বিভ্রান্তির একটি সাধারণ বিষয় (উইকিপিডিয়ায় জেনেরিক প্রোগ্রামিং পৃষ্ঠা, কিছু সি ++ টিউটোরিয়াল এবং এই পৃষ্ঠায় অন্যান্য উত্তর সহ)। যতদূর সি ++ এর সাথে সম্পর্কিত, "টেম্পলেট শ্রেণি" বলে কিছুই নেই, সেখানে কেবল একটি "শ্রেণীর টেম্পলেট" রয়েছে। এই বাক্যাংশটি পড়ার উপায়টি "ফাংশনের টেম্পলেট" এর বিপরীতে "শ্রেণীর জন্য একটি টেম্পলেট", যা "কোনও ফাংশনের টেম্পলেট"। আবার: ক্লাসগুলি টেমপ্লেট সংজ্ঞায়িত করে না, টেম্পলেটগুলি ক্লাসগুলি (এবং ফাংশন) সংজ্ঞায়িত করে । উদাহরণ হিসেবে বলা যায়, এই একটি হল টেমপ্লেট , নির্দিষ্টভাবে একটি বর্গ টেমপ্লেট কিন্তু এটা না একটি বর্গ :

template<typename T> class MyClassTemplate
{ 
    ...
};

ঘোষণাটি কোনও টেম্পলেট ভিত্তিক MyClassTemplate<int> একটি শ্রেণি, বা পেডেন্টালি। কোনও টেম্পলেট ভিত্তিক কোনও টেম্পলেট ভিত্তিক কোনও শ্রেণীর কোনও বিশেষ বৈশিষ্ট্য নেই। বিশেষ বৈশিষ্ট্যগুলি টেমপ্লেটের নিজস্ব

"টেমপ্লেট শ্রেণি" শব্দটির অর্থ কিছুই নেই, কারণ "টেমপ্লেট" শব্দের বিশেষণ হিসাবে কোনও অর্থ নেই যখন "C "+ অবধি C ++ এর সাথে যুক্ত হয়। এটা একটা অস্তিত্ব বোঝা বর্গ যে হয় (অথবা সংজ্ঞায়িত) একটি টেমপ্লেট , যা একটি ধারণা যে সি ++ বিদ্যমান নয়।

আমি সাধারণ বিভ্রান্তিটি বুঝতে পারি, কারণ এটি সম্ভবত এই সত্যটির উপর ভিত্তি করে তৈরি হয়েছে যে শব্দগুলি প্রকৃত ভাষায় "টেম্পলেট শ্রেণি" ক্রমে প্রদর্শিত হয়, যা সম্পূর্ণ অন্য একটি গল্প।


+1 কখনও কখনও এটি কোনও শ্রেণীর "উত্স" আলাদা করার যে কোনও কারণেই কার্যকর হয়, এই ক্ষেত্রে আপনি "টেম্পলেট শ্রেণি" শব্দটি যুক্তিসঙ্গতভাবে ব্যবহার করতে পারেন - তবে আপনি যে কারণগুলি দিয়েছেন তার কারণে আপনি কী বোঝাতে চেয়েছেন তা যত্ন সহকারে সংজ্ঞায়িত করা ভাল ধারণা ।
j_random_hacker

4
@ j_random_hacker - নীচে লিটব এর উত্তর দেখুন, তবে সংক্ষেপে, এর জন্য পছন্দের শব্দটি হ'ল "শ্রেণীর টেম্পলেট বিশেষায়িতকরণ"
নিশ্চিত নয়

@ না নিশ্চিত: ভাল আসলে আমি "ক্লাস টেম্পলেট বিশেষীকরণ" কিছুটা অস্পষ্ট দেখতে পাই, কারণ এটি কোনও টেমপ্লেটের জন্য স্পষ্ট বা আংশিক বিশেষত্ব নির্ধারণের প্রক্রিয়াটিকেও উল্লেখ করতে পারে - এমন কিছু যা সত্যিকারের "শ্রেণি" উত্পাদন করার প্রয়োজন হয় না। :) আইএমএইচও "ক্লাস টেম্পলেট ইনস্ট্যান্টেশন" হ'ল পরিষ্কার শব্দ।
j_random_hacker

4
@ j_random_hacker: এর জন্য একটি উপযুক্ত শব্দ রয়েছে - "সুস্পষ্ট শ্রেণীর টেম্পলেট বিশেষীকরণ" এবং "আংশিক সুস্পষ্ট শ্রেণীর টেম্পলেট বিশেষায়িতকরণ"। জটিল, তবে অস্পষ্ট নয় :)
নিশ্চিত নন

4
Terms1 শর্তাদির অর্থ শর্তাদি ব্যবহার করে লোকেরা কী বোঝায়। আক্ষরিক অর্থ বিশ্লেষণ শুরু করা অর্থহীন। প্রাত্যহিক জীবন বা ইঞ্জিনিয়ারিং থেকে অন্য কোনও পদ দিয়ে কেবল এটি ব্যবহার করে দেখুন। সংক্ষেপে, এই উত্তর হোগওয়াশ। বর্জনকে উদ্ধৃত করে এসএইচএইচের উত্তর ঠিক আছে।
চিয়ার্স এবং এইচটিএইচ - Alf

15

সি ++ এর স্রষ্টা বজর্ন স্ট্রস্ট্রপ তাঁর বই দ্য সি ++ প্রোগ্রামিং ল্যাঙ্গুয়েজ ৪ র্থ সংস্করণে বলেছেন , ২৩.২.১ একটি টেমপ্লেট সংজ্ঞায়িত:

শ্রেণি টেম্পলেট এবং টেমপ্লেট শ্রেণীর শর্তগুলির মধ্যে অর্থপূর্ণ পার্থক্য তৈরি করার মতো লোক রয়েছে । আমি না; এটি খুব সূক্ষ্ম হবে: দয়া করে এই পদগুলিকে বিনিময়যোগ্য বিবেচনা করুন। একইভাবে, আমি ফাংশন টেম্পলেটটিকে টেমপ্লেট ফাংশনের সাথে বিনিময়যোগ্য বিবেচনা করি ।


13

পার্থক্যটি হ'ল "টেমপ্লেট শ্রেণি" শব্দটি কেবল সি ++ স্ট্যান্ডার্ডে নেই। এটি একটি শব্দটি বেশিরভাগ লোকেরা ব্যবহার করে যা মনে করে যে "ক্লাস টেম্পলেট" শব্দটি বিভ্রান্তিকর (যেমন 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; };
  • এআরএম ক্লাসকে (2), এবং (4) এবং (5) একটি টেম্পলেট শ্রেণীর দ্বারা উত্পন্ন ক্লাস বলে । আর্ম আংশিক বিশেষত্ব সম্পর্কে ইতিমধ্যে জানত কিনা তা আমি নিশ্চিত নই। তবে যদি (3) কে একটি টেম্পলেট শ্রেণি বলা হত না, কারণ (3) কোনও শ্রেণি সংজ্ঞায়িত করে না, তবে একটি টেমপ্লেট সংজ্ঞায়িত করে।
  • বর্তমান স্ট্যান্ডার্ডটি ক্লাস (2) কল করে এবং (4) এবং (5) শ্রেণীর টেম্পলেট বিশেষায়নের দ্বারা উত্পাদিত । এবং (3) স্পষ্ট বিশেষজ্ঞের বিপরীতে একটি আংশিক বিশেষীকরণ বলা হয় । এটি কখনও কখনও (3) একটি বিশেষায়নের (3.2 / 5 - যদিও ক্রস-লিঙ্কগুলি স্পষ্ট করে বোঝায়) ডাকে, যদিও আমার কাছে এটি সম্পূর্ণরূপে পরিষ্কার নয়, যেহেতু এটি "শ্রেণি, ফাংশন বা শ্রেণি হিসাবে" বিশেষায়িতকরণ "সংজ্ঞায়িত হয়েছে সদস্য ", যা (3) সন্তুষ্ট করে না।

4
হেহে। হ্যাঁ এবং আরও কয়েকজন এখনও সেই সেটটিতে অবদান রাখছেন। উল্লেখযোগ্যভাবে সি ++ ফ্যাক্ট লাইট এবং কিউটি ডকুমেন্টেশন। ফ্যাক্ট লাইটের লেখক আমাকে একটি মেইলে বলেছিলেন যে তিনি আরও একটি এফএকিউ আইটেম লিখতে চান যা ব্যাখ্যা করে যে "স্পেশালাইজেশন" শব্দটি ব্যবহার করা ভাল কারণ এটি কম বিভ্রান্তি সৃষ্টি করে (ব্যবহারকারীর দ্বারা রচিত বিশেষায়নের "স্পষ্ট স্পেশালাইজেশন" ব্যবহার করে, তারপর)। কিউটি ছেলেরা আমাকে বলেছিল যে তারা "শ্রেণির টেম্পলেট" শব্দটি ব্যবহার করতে চায় না .... তারা এটিকে খুব "অপ্রাকৃত" বলে মনে করে। খুব খারাপ.
জোহানেস স্কাউব - লিটব

@ জোহানেস শ্যাব-লিটব: এআরএম লিখেছেন বজর্ন স্ট্রোস্ট্রপ এবং মার্গারেট এলিস, প্রায় 1991 আইআইআরসি। এআরএম থেকে আপনার উদ্ধৃতি বার্জারের টিসিপিপিএল ৪ র্থ সংস্করণ থেকে এসএইচএইচের উদ্ধৃতিটির সাথে বিরোধী । সুতরাং এটি ভাল যে আপনি পুরানো (প্রাক-মান) এবং বর্তমান পরিভাষার মধ্যে একটি পার্থক্য আঁকুন।
চিয়ার্স এবং এইচটিএইচ - Alf


1

ক্লাস টেম্পলেট হ'ল একটি টেম্পলেট যা শ্রেণি তৈরি করতে ব্যবহৃত হয় যখন একটি টেম্পলেট শ্রেণি একটি শ্রেণি যা কোনও টেম্পলেট দ্বারা উত্পাদিত হয়।


0

টেমপ্লেট শ্রেণি: জেনেরিক সংজ্ঞা বা ক্লায়েন্টের দ্বারা তথ্য সরবরাহ না করা অবধি তড়িঘড়ি করা হয়নি এমন প্যারামিটার সহ একটি বর্গ। এটি প্লেইন টেম্পলেটগুলির জন্য একটি জার্গন হিসাবে উল্লেখ করা হয় pre উপসর্গ টেম্পলেট এবং টি ব্যবহারের জন্য কেবল ক্লাস। শ্রেণীর টেম্পলেট: শ্রেণীর স্বতন্ত্র নির্মাণ একটি শ্রেণি টেম্পলেট দ্বারা নির্দিষ্ট করা হয় যা শ্রেণীর ব্যবহার করে পৃথক বস্তুগুলি কীভাবে তৈরি করা হয় তার প্রায় অনুরূপ। এটি টেমপ্লেট শ্রেণীর একটি বিষয়কে উল্লেখ করা হয় প্রাক্তন-শ্রেণীর নাম অবজেক্টনাম (যুক্তি তালিকা)


0

ক্লাস টেম্পলেট বিভিন্ন ধরণের অবজেক্টের জন্য জেনেরিক শ্রেণি। মূলত এটি পরামিতিগুলির উপর ভিত্তি করে শ্রেণি উত্পন্ন করার জন্য একটি স্পেসিফিকেশন সরবরাহ করে। যখনই কোনও নতুন অবজেক্ট তৈরি করা হবে তখনই সেই উদ্দেশ্যে স্মৃতিতে একটি নতুন শ্রেণি অনুষ্ঠিত হবে। একে ক্লাস টেম্পলেট ইনস্ট্যান্টিয়েটিং বলা হয় এবং ক্লাসের প্রতিটি ইনস্ট্যান্টিয়েটেড সংস্করণকে টেমপ্লেট শ্রেণি বলা হয়।


0

এই কাগজটি একবার দেখুন (ডাব্লুজি 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আপনি উপরে বর্ণিত শ্রেণীর সম্পর্কে : আমি জানতাম না যে এই জাতীয় সদস্য-ফাংশন-টেম্পলেট নিষিদ্ধ ছিল। আমার চেষ্টা করা সমস্ত সংকলক এটি গ্রহণ করেছে। আমি কী মিস করছি?
ডান_দিন_প্যানটেলিমন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.