হ্যাঁ, এটি একটি নন-টাইপ প্যারামিটার। আপনার বিভিন্ন ধরণের টেম্পলেট প্যারামিটার থাকতে পারে
- পরামিতি টাইপ করুন।
- প্রকারভেদ
- টেমপ্লেটগুলি (কেবল ক্লাস এবং ওরফে টেম্পলেট, কোনও ফাংশন বা ভেরিয়েবল টেম্পলেট)
- নন-টাইপ পরামিতি
- পয়েন্টার
- তথ্যসূত্র
- অবিচ্ছেদ্য ধ্রুবক প্রকাশ
আপনার যা আছে তা শেষ ধরণের। এটি একটি সংকলন সময় ধ্রুবক (তথাকথিত ধ্রুবক অভিব্যক্তি) এবং টাইপ পূর্ণসংখ্যা বা গণনার। এটি স্ট্যান্ডার্ডে দেখার পরে, আমাকে শ্রেণিক টেম্পলেটগুলি প্রকারের বিভাগে সরিয়ে নিতে হয়েছিল - যদিও টেমপ্লেটগুলি প্রকার নয়। তবে তাদের এ জাতীয় ধরণের বিবরণ দেওয়ার উদ্দেশ্যে টাইপ-পরামিতি বলা হয়। আপনার পয়েন্টার থাকতে পারে (এবং সদস্য পয়েন্টারও) এবং অবজেক্ট / ফাংশনগুলির রেফারেন্স থাকতে পারে যা বাহ্যিক সংযোগ রয়েছে (যাঁরা অন্যান্য বস্তু ফাইল থেকে লিঙ্ক করতে পারেন এবং যার ঠিকানা পুরো প্রোগ্রামে অনন্য)। উদাহরণ:
টেমপ্লেট ধরণের পরামিতি:
template<typename T>
struct Container {
T t;
};
// pass type "long" as argument.
Container<long> test;
টেমপ্লেট পূর্ণসংখ্যা প্যারামিটার:
template<unsigned int S>
struct Vector {
unsigned char bytes[S];
};
// pass 3 as argument.
Vector<3> test;
টেমপ্লেট পয়েন্টার প্যারামিটার (একটি ফাংশনে একটি পয়েন্টার পাস করে)
template<void (*F)()>
struct FunctionWrapper {
static void call_it() { F(); }
};
// pass address of function do_it as argument.
void do_it() { }
FunctionWrapper<&do_it> test;
টেমপ্লেট রেফারেন্স প্যারামিটার (একটি পূর্ণসংখ্যা পাস)
template<int &A>
struct SillyExample {
static void do_it() { A = 10; }
};
// pass flag as argument
int flag;
SillyExample<flag> test;
টেমপ্লেট টেম্পলেট প্যারামিটার।
template<template<typename T> class AllocatePolicy>
struct Pool {
void allocate(size_t n) {
int *p = AllocatePolicy<int>::allocate(n);
}
};
// pass the template "allocator" as argument.
template<typename T>
struct allocator { static T * allocate(size_t n) { return 0; } };
Pool<allocator> test;
কোনও পরামিতি ছাড়াই একটি টেম্পলেট সম্ভব নয়। তবে কোনও সুস্পষ্ট যুক্তি ছাড়াই কোনও টেম্পলেটটি সম্ভব - এতে ডিফল্ট আর্গুমেন্ট রয়েছে:
template<unsigned int SIZE = 3>
struct Vector {
unsigned char buffer[SIZE];
};
Vector<> test;
সিনট্যাক্টিক্যালি, template<>
কোনও পরামিতি ছাড়াই কোনও টেমপ্লেটের পরিবর্তে একটি স্পষ্ট টেম্পলেট বিশেষায়িতকরণ চিহ্নিত করা যায়:
template<>
struct Vector<3> {
// alternative definition for SIZE == 3
};
static constexpr int
আপনার পরিবর্তে প্রকারটিও ব্যবহার করতে পারেনenum
। সুতরাংFactorial<0>
টেমপ্লেটটি থাকতে পারেstatic constexpr int value = 1
এবংtemplate <int N> struct Factorial
থাকতে পারেstatic constexpr int value = N * Factorial<N - 1>::value;