কিভাবে একটি শ্রেণীর মধ্যে একটি টেমপ্লেট ফাংশন তৈরি করতে? (C ++) গুলির


144

আমি জানি এটি একটি টেম্পলেট ফাংশন করা সম্ভব:

template<typename T>
void DoSomeThing(T x){}

এবং এটি একটি টেম্পলেট শ্রেণি তৈরি করা সম্ভব:

template<typename T>
class Object
{
public:
    int x;
};

তবে কোনও টেম্প্লেটের মধ্যে নয়, এবং সেই ক্লাসে কোনও ফাংশনটি কোনও টেম্পলেট তৈরি করা কি সম্ভব? অর্থাৎ,

//I have no idea if this is right, this is just how I think it would look
class Object
{
public:
    template<class T>
    void DoX(){}
};

বা এমন কিছুর কিছু আছে যেখানে ক্লাসটি কোনও টেম্পলেটটির অংশ নয়, তবে কার্যকারিতাটি কী?

উত্তর:


115

আপনার অনুমানটি সঠিক। আপনাকে কেবলমাত্র মনে রাখতে হবে যে সদস্য ফাংশন টেম্পলেট সংজ্ঞা (ঘোষণার পাশাপাশি) শিরোনামের ফাইলে থাকা উচিত, সিপিপি নয়, যদিও এটি শ্রেণির ঘোষণার নিজেই বডিতে থাকতে হয় না


3
এবং এছাড়াও আপনি তাদের বিশেষজ্ঞ করতে পারবেন না যে। :-(
ফ্রাঙ্ক ক্রুয়েজার

7
ঠিক সত্য নয়। সংজ্ঞাটি কোনও সিপিপি ফাইলে থাকতে পারে, যতক্ষণ না এটি সংজ্ঞায়িত হওয়ার পরে কোনও অ-টেম্পলেট ফাংশন / পদ্ধতি থেকে প্রতিটি অনন্য টেম্পলেট প্যারামিটার এন-আপলেট জন্য একবার কল করা হয়।
বেনোট

1
সুতরাং আমার "উচিত" - এটি শিরোনামে রাখা তা সম্পাদন করার সহজতম উপায়।
নিশ্চিত নয়

4
আসলে, আমি বিশ্বাস করি আপনি স্পষ্টভাবে এগুলিকে বিশেষজ্ঞ করতে পারেন, তবে আপনি আংশিকভাবে তাদের বিশেষজ্ঞ করতে পারবেন না। দুর্ভাগ্যক্রমে আমি জানি না এটি কোনও সংকলক-নির্দিষ্ট এক্সটেনশন বা সি ++ স্ট্যান্ডার্ড কিনা।
প্যাট্রিক জনমেয়ার

7
এটি আসলে স্ট্যান্ডার্ড সি ++। আপনি স্ট্রাক্ট এ {টেমপ্লেট <টাইপেনাম> শূন্য চ () করতে পারেন; }; টেমপ্লেট <> শূন্য A :: f <int> () {example উদাহরণস্বরূপ। আপনি কেবল তাদের শ্রেণীর স্কোপগুলিতে বিশেষীকরণ করতে পারবেন না, তবে নেমস্পেসের স্কোপ এ সম্পন্ন করার পরে আপনি এত ভাল করতে পারেন। (বিশেষায়িতকরণটি আসলে যে সুযোগে দেওয়া হয়েছে তার সাথে বিভ্রান্ত হওয়ার দরকার নেই: বিশেষীকরণটি এখনও শ্রেণীর সদস্য হতে পারে - তবে এর সংজ্ঞাটি नेमস্পেস স্কোপে করা হয় Often প্রায়শই যে জায়গাতে কোনও কিছু স্থাপন করা হয় তা সুযোগের মতোই হয় scope কিছুতে সংজ্ঞায়িত করা হয় - তবে এটি কখনও কখনও সত্য হয় না যেমন শ্রেণীর
বহির্মুখী

70

এখানে দেখুন: টেমপ্লেট , টেম্পলেট পদ্ধতি , সদস্য টেমপ্লেট, সদস্য ফাংশন টেম্পলেট

class   Vector
{
  int     array[3];

  template <class TVECTOR2> 
  void  eqAdd(TVECTOR2 v2);
};

template <class TVECTOR2>
void    Vector::eqAdd(TVECTOR2 a2)
{
  for (int i(0); i < 3; ++i) array[i] += a2[i];
}

ভালো উদাহরণ. তবে টেমপ্লেট <টাইপনেম টি> ক্লাস ফিক্সিটিনোর ভিতরে কেন ... ???
মার্টিয়ান2049

@ মার্টিয়ান2049 আমি বিশ্বাস করি এটি হ'ল টেমপ্লেটটি কেবল শ্রেণীর মধ্যে সদস্য ফাংশনের ক্ষেত্রে প্রযোজ্য, পুরো ক্লাসে নয়। ঠিক যেমন ওপি জিজ্ঞাসা করেছে।
সিবিকে

21

হ্যাঁ, টেমপ্লেট সদস্যের ফাংশনগুলি পুরোপুরি আইনী এবং অসংখ্য উপলক্ষে কার্যকর।

একমাত্র সতর্কতা হ'ল টেমপ্লেট সদস্যের কার্যগুলি ভার্চুয়াল হতে পারে না।


9

সবচেয়ে সহজ উপায় হ'ল ঘোষণা এবং সংজ্ঞাটি একই ফাইলে রাখা, তবে এটি অত্যধিক আকারের এক্সিউটেবল ফাইলের কারণ হতে পারে। যেমন

class Foo
{
public:
template <typename T> void some_method(T t) {//...}
}

এছাড়াও, পৃথক ফাইলগুলিতে টেম্পলেট সংজ্ঞা স্থাপন করা সম্ভব, অর্থাত্ তাদের .cpp এবং .h ফাইলগুলিতে স্থাপন করা। আপনাকে যা করতে হবে তা হ'ল স্পষ্টভাবে .cpp ফাইলগুলিতে টেম্পলেট ইনস্ট্যান্টেশন অন্তর্ভুক্ত করা। যেমন

// .h file
class Foo
{
public:
template <typename T> void some_method(T t);
}

// .cpp file
//...
template <typename T> void Foo::some_method(T t) 
{//...}
//...

template void Foo::some_method<int>(int);
template void Foo::some_method<double>(double);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.