নিম্নলিখিত তথ্য তারিখ সীমার বাইরে। এটি সর্বশেষতম কনসেপ্টস লাইট খসড়া অনুযায়ী আপডেট করা দরকার।
সীমাবদ্ধতার প্রস্তাবের ধারা 3 এটি যুক্তিসঙ্গত গভীরতায় depthেকে রাখে।
ধারণাগুলির প্রস্তাবটি অল্প সময়ের জন্য ব্যাক বার্নারে রাখা হয়েছে এই আশায় যে সীমাবদ্ধতাগুলি (অর্থাত্ ধারণাগুলি-হালকা) আরও কম সময়ের স্কেল করে প্রয়োগ করা যেতে পারে এবং বর্তমানে সি ++ 14 এর জন্য কমপক্ষে কিছু লক্ষ্য করা যায় for সীমাবদ্ধতার প্রস্তাবনাটি ধারণার পরবর্তী সংজ্ঞাতে মসৃণ রূপান্তর হিসাবে কাজ করার জন্য ডিজাইন করা হয়েছে। সীমাবদ্ধতা ধারণার প্রস্তাবের অংশ এবং এটি এর সংজ্ঞাতে প্রয়োজনীয় বিল্ডিং ব্লক।
ইন সি জন্য ধারণা লাইব্রেরি নকশা ++, , সাটন এবং স্ট্রোভস্ট্রুপের নিম্নলিখিত সম্পর্ক বিবেচনা করুন:
ধারণাগুলি = সীমাবদ্ধতা + অ্যাক্সিমস
দ্রুত তাদের অর্থ সংক্ষিপ্ত করতে:
- সীমাবদ্ধতা - কোনও প্রকারের স্ট্যাটিক্যালি মূল্যায়নযোগ্য বৈশিষ্ট্যের উপরে একটি শিকারী। খাঁটি সিনট্যাকটিক প্রয়োজনীয়তা। কোনও ডোমেন বিমূর্ততা নয়।
- অ্যাক্সিওমস - ধরণের ধনাত্মক প্রয়োজনীয়তা যা সত্য বলে ধরে নেওয়া হয়। স্থিতিশীলভাবে চেক করা হয়নি।
- ধারণা - সাধারণ, তাদের যুক্তিতে অ্যালগরিদমের বিমূর্ত প্রয়োজনীয়তা। সীমাবদ্ধতা এবং axioms পদে সংজ্ঞায়িত।
সুতরাং আপনি যদি সীমাবদ্ধতাগুলিতে (সিনট্যাক্টিক বৈশিষ্ট্য) অক্ষর (শব্দার্থক বৈশিষ্ট্য) যুক্ত করেন তবে আপনি ধারণাগুলি পাবেন।
ধারণা-লাইট
কনসেপ্টস-লাইট প্রস্তাবনাটি কেবল আমাদের প্রথম অংশ নিয়ে আসে, প্রতিবন্ধকতাগুলি, তবে এটি সম্পূর্ণরূপে ধারণাগুলির দিকে গুরুত্বপূর্ণ এবং প্রয়োজনীয় পদক্ষেপ।
সীমাবদ্ধতা
সীমাবদ্ধতাগুলি সিনট্যাক্স সম্পর্কে । তারা আমাদের সংকলন সময়ে কোনও প্রকারের বৈশিষ্ট্যগুলি বিশিষ্ট করে তোলার একটি উপায় দেয়, যাতে আমরা তাদের সিনট্যাক্টিক বৈশিষ্ট্যের ভিত্তিতে টেমপ্লেট আর্গুমেন্ট হিসাবে ব্যবহৃত প্রকারগুলিকে সীমাবদ্ধ করতে পারি। সীমাবদ্ধতার জন্য বর্তমান প্রস্তাবনায়, তারা প্রজেকশনাল ক্যালকুলাসের উপসেটটি যেমন &&
এবং লজিকাল সংযোগগুলি ব্যবহার করে প্রকাশ করা হয় ||
।
আসুন কর্মের প্রতিবন্ধকতার দিকে একবার নজর দিন:
template <typename Cont>
requires Sortable<Cont>()
void sort(Cont& container);
এখানে আমরা একটি ফাংশন টেমপ্লেট সংজ্ঞায়িত করছি sort
। নতুন সংযোজন দফা প্রয়োজন । প্রয়োজনীয় ধারাটি এই ফাংশনের জন্য টেমপ্লেট আর্গুমেন্টগুলির উপর কিছু বাধা দেয়। বিশেষত, এই সীমাবদ্ধতাটি বলে যে প্রকারটি Cont
অবশ্যই একটি Sortable
প্রকারের হতে হবে । একটি ঝরঝরে জিনিস এটি আরও সংক্ষিপ্ত আকারে এইভাবে লেখা যেতে পারে:
template <Sortable Cont>
void sort(Cont& container);
এখন আপনি যদি Sortable
এই ফাংশনটির জন্য বিবেচিত না হয় এমন কোনও কিছু পাস করার চেষ্টা করেন তবে আপনি একটি দুর্দান্ত ত্রুটি পাবেন যা তাৎক্ষণিকভাবে আপনাকে বলবে যে এর জন্য কেটে নেওয়া টাইপটি T
কোনও Sortable
প্রকার নয়। আপনি যদি এটি সি ++ 11 এ করে থাকেন তবে ফাংশনটির ভেতর থেকে কিছু ভয়ঙ্কর ত্রুটি ছুঁড়েছে sort
যা কারও কাছেই বোধগম্য নয়।
সীমাবদ্ধতার পূর্বাভাস টাইপ বৈশিষ্ট্যের সাথে খুব মিল। তারা কিছু টেম্পলেট আর্গুমেন্ট প্রকার নেয় এবং আপনাকে এ সম্পর্কে কিছু তথ্য দেয়। টাইপ সম্পর্কে নিম্নলিখিত ধরণের প্রশ্নের উত্তর দেওয়ার সীমাবদ্ধতাগুলি:
- এই ধরণের কি এমন-ও-এমন অপারেটর ওভারলোড হয়েছে?
- এই অপারেটরের অপারেশন হিসাবে এই ধরণেরগুলি ব্যবহার করা যেতে পারে?
- এই ধরণের কি এরকম ও এই জাতীয় বৈশিষ্ট্য রয়েছে?
- এই ধ্রুবক ভাবটি কি তার সমান? (অ-টাইপ টেম্পলেট আর্গুমেন্টের জন্য)
- এই ধরণের কি yada-yada নামে একটি ফাংশন রয়েছে যা সেই ধরণের ফেরত দেয়?
- এই ধরণেরটি কী হিসাবে ব্যবহৃত হবে তা সমস্ত সিনট্যাকটিক প্রয়োজনীয়তা পূরণ করে?
তবে সীমাবদ্ধতাগুলি ধরণের বৈশিষ্ট্যগুলি প্রতিস্থাপনের জন্য বোঝানো হয় না । পরিবর্তে, তারা হাতে কাজ করবে will কিছু ধরণের বৈশিষ্ট্য এখন ধরণের বৈশিষ্ট্যের ক্ষেত্রে ধারণা এবং কিছু ধারণার ক্ষেত্রে সংজ্ঞায়িত করা যেতে পারে।
উদাহরণ
সুতরাং সীমাবদ্ধতাগুলির বিষয়ে গুরুত্বপূর্ণ বিষয়টি হ'ল তারা শব্দার্থবিজ্ঞানের একটি আইওটা সম্পর্কে চিন্তা করে না। সীমাবদ্ধতার কয়েকটি ভাল উদাহরণ হ'ল:
Equality_comparable<T>
: টাইপটি ==
একই ধরণের উভয় অপারেন্ডের সাথে রয়েছে কিনা তা পরীক্ষা করে ।
Equality_comparable<T,U>
: ==
প্রদত্ত প্রকারের বাম এবং ডান ক্রিয়াকলাপগুলির সাথে আছে কিনা তা পরীক্ষা করে
Arithmetic<T>
: প্রকারটি একটি গাণিতিক ধরণের কিনা তা পরীক্ষা করে।
Floating_point<T>
: প্রকারটি একটি ভাসমান পয়েন্ট টাইপ কিনা তা পরীক্ষা করে।
Input_iterator<T>
: টাইপটি সিন্ট্যাকটিক অপারেশনগুলিকে সমর্থন করে কিনা তা যাচাই করে যা কোনও ইনপুট পুনরাবৃত্তিকে অবশ্যই সমর্থন করে support
Same<T,U>
: প্রদত্ত প্রকারটি একই রকম কিনা তা পরীক্ষা করে।
আপনি জিসিসির একটি বিশেষ ধারণা-লাইট বিল্ড দিয়ে এগুলি চেষ্টা করে দেখতে পারেন ।
ধারণার বাইরে লাইট
এখন আমরা ধারণাগুলি-হালকা প্রস্তাবের বাইরে সবকিছুতে .ুকি। এটি ভবিষ্যতের চেয়েও বেশি ভবিষ্যত। এখান থেকে সমস্ত কিছু সম্ভবত কিছুটা পরিবর্তিত হতে পারে।
অ্যাক্সিমস
অ্যাক্সিওমস শব্দার্থকতা সম্পর্কে সমস্ত । তারা সম্পর্ক, আক্রমণকারী, জটিলতার গ্যারান্টি এবং এ জাতীয় অন্যান্য বিষয় নির্দিষ্ট করে। আসুন একটি উদাহরণ তাকান।
যদিও Equality_comparable<T,U>
সীমাবদ্ধতা আপনাকে বলবে যে এমন একটি রয়েছে operator==
যা প্রকারভেদে লাগে T
এবং U
এটি আপনাকে অপারেশনটির অর্থ কী তা বলে না । তার জন্য, আমাদের অ্যাক্সিয়াম থাকবে Equivalence_relation
। এই অ্যাকিয়োম বলে যে এই দুটি ধরণের বস্তু যখন operator==
দেওয়ার সাথে তুলনা করা হয় তখন true
এই বস্তুগুলি সমতুল্য। এটি অপ্রয়োজনীয় মনে হতে পারে, তবে তা অবশ্যই তা নয়। আপনি সহজেই operator==
এটির মতো আচরণ করে এমন একটি সংজ্ঞা দিতে পারেন operator<
। আপনি এটি করতে খারাপ হতে চাই, কিন্তু আপনি করতে পারেন।
আরেকটি উদাহরণ হ'ল Greater
অ্যাক্সিয়াম। দুটি ধরণের অবজেক্টের T
সাথে >
এবং <
অপারেটরের সাথে তুলনা করা যায় বলা ভাল, এবং এটির অর্থ কী ? Greater
সবর্জনবিদিত বলছেন যে iff x
তারপর বেশী y
, তারপর y
চেয়ে কম হয় x
। প্রস্তাবিত স্পেসিফিকেশন যেমন একটি axiom দেখতে:
template<typename T>
axiom Greater(T x, T y) {
(x>y) == (y<x);
}
সুতরাং axioms নিম্নলিখিত ধরণের প্রশ্নের উত্তর:
- এই দুই অপারেটরের কি একে অপরের সাথে সম্পর্ক রয়েছে?
- এই ধরণের এবং এই জাতীয় ধরণের জন্য এই অপারেটরটির অর্থ কি এটি?
- এই ধরণের এই অপারেশনের কি এই জটিলতা রয়েছে?
- এই অপারেটরের এই ফলাফলটি কি বোঝায় যে এটি সত্য?
এটি হ'ল, তারা পুরোপুরি শব্দার্থবিজ্ঞানের সাথে ধরণের এবং সেই ধরণের ক্রিয়াকলাপগুলি নিয়ে উদ্বিগ্ন। এই জিনিসগুলি স্থিতিশীলভাবে চেক করা যায় না। যদি এটি যাচাই করা দরকার হয় তবে কোনও ধরণের অবশ্যই কোনওভাবে ঘোষণা করতে হবে যে এটি এই শব্দার্থবিরোধীদের মেনে চলে।
উদাহরণ
এখানে অ্যাকোরিওমের কয়েকটি সাধারণ উদাহরণ রয়েছে:
Equivalence_relation
: যদি দুটি বস্তু তুলনা করে তবে ==
তারা সমান।
Greater
: যখনই x > y
, তখন y < x
।
Less_equal
: যখনই x <= y
, তখন !(y < x)
।
Copy_equality
: x
এবং y
প্রকারের জন্য T
: যদি x == y
, অনুলিপি তৈরি করে T{x} == y
এখনও একই ধরণের একটি নতুন অবজেক্ট তৈরি করা হয় x == y
(তবে এটি অ-ধ্বংসাত্মক)।
ধারণা
এখন ধারণাগুলি সংজ্ঞায়িত করা খুব সহজ; এগুলি কেবল সীমাবদ্ধতা এবং অদ্ভুত সংমিশ্রণ । এগুলি একটি প্রকারের সিনট্যাক্স এবং শব্দার্থবিজ্ঞানের উপর একটি বিমূর্ত প্রয়োজন সরবরাহ করে।
উদাহরণ হিসাবে, নিম্নলিখিত Ordered
ধারণাটি বিবেচনা করুন :
concept Ordered<Regular T> {
requires constraint Less<T>;
requires axiom Strict_total_order<less<T>, T>;
requires axiom Greater<T>;
requires axiom Less_equal<T>;
requires axiom Greater_equal<T>;
}
প্রথম নোট করুন যে টেমপ্লেটটি টাইপ T
হওয়ার Ordered
জন্য এটি Regular
ধারণার প্রয়োজনীয়তাও মেটানো উচিত। Regular
ধারণা একটি খুব মৌলিক প্রয়োজনীয়তা যে টাইপ ভালভাবে ভদ্র হয় - এটা, নির্মাণ করা যেতে পারে ধ্বংস অনুলিপি এবং তুলনায়।
এই প্রয়োজনীয়তাগুলি ছাড়াও, Ordered
প্রয়োজনীয়তাগুলির T
জন্য একটি সীমাবদ্ধতা এবং চারটি অক্ষরেখা পূরণ করা প্রয়োজন :
- বাধা: একটি
Ordered
ধরণের অবশ্যই একটি থাকতে পারে operator<
। এটি স্থিতিশীলভাবে চেক করা হয়েছে সুতরাং এটি অবশ্যই বিদ্যমান।
- অক্ষর: এর জন্য
x
এবং y
প্রকারের T
:
x < y
একটি কঠোর মোট অর্ডার দেয়।
- যখন এর
x
চেয়ে বড় হয় y
, এর চেয়ে y
কম x
হয় এবং বিপরীত হয়।
- যখন
x
কম বা সমান y
, y
চেয়ে কম নয় x
, এবং তদ্বিপরীত।
- যখন
x
এর চেয়ে বড় বা সমান y
, y
তার চেয়ে অনেক বেশী নয় x
, এবং তদ্বিপরীত।
এই জাতীয় সীমাবদ্ধতা এবং অ্যাক্সিমের সংমিশ্রণ আপনাকে ধারণা দেয়। তারা অ্যালগরিদমের সাথে ব্যবহারের জন্য বিমূর্ত প্রকারের সিনট্যাক্টিক এবং সিনমেটিক প্রয়োজনীয়তা সংজ্ঞায়িত করে। অ্যালগরিদমকে বর্তমানে ধরে নিতে হবে যে ব্যবহৃত ধরণেরগুলি নির্দিষ্ট ক্রিয়াকলাপকে সমর্থন করবে এবং নির্দিষ্ট শব্দার্থকে প্রকাশ করবে। ধারণাগুলি সহ আমরা প্রয়োজনীয়তা পূরণ করেছি তা নিশ্চিত করতে সক্ষম হব।
ইন সর্বশেষ ধারণা নকশা , কম্পাইলার শুধুমাত্র চেক করবে যে একটি ধারণার অন্বিত প্রয়োজনীয়তা টেমপ্লেট আর্গুমেন্টের দ্বারা পূর্ণ করা হয়। Axioms চেক না করা বাকি আছে। যেহেতু অখণ্ডগুলি স্ট্যামেন্টিকগুলি বোঝায় যা স্থিতিকরূপে মূল্যায়নযোগ্য নয় (বা প্রায়শই সম্পূর্ণরূপে পরীক্ষা করা অসম্ভব) তাই কোনও প্রকারের লেখককে স্পষ্টভাবে বলতে হবে যে তাদের ধরণের ধারণার সমস্ত প্রয়োজনীয়তা পূরণ হয়। এটি পূর্ববর্তী ডিজাইনে কনসেপ্ট ম্যাপিং হিসাবে পরিচিত ছিল তবে এটি মুছে ফেলা হয়েছে।
উদাহরণ
ধারণার কয়েকটি উদাহরণ এখানে দেওয়া হয়েছে:
Regular
প্রকারগুলি নির্মাণযোগ্য, ধ্বংসাত্মক, অনুলিপিযোগ্য এবং তুলনা করা যায়।
Ordered
প্রকারগুলি সমর্থন করে operator<
এবং একটি কঠোর মোট অর্ডারিং এবং অন্যান্য অর্ডারিং শব্দার্থক থাকে।
Copyable
প্রকারগুলি হ'ল অনুলিপি নির্মাণযোগ্য , ধ্বংসাত্মক এবং যদি x
এর সমান হয় y
এবং x
অনুলিপি করা হয় তবে অনুলিপিটিও এর সাথে সমান তুলনা করবে y
।
Iterator
ধরনের সংযুক্ত করেছেন আবশ্যক ধরনের value_type
, reference
, difference_type
, এবং iterator_category
নিজেদের নির্দিষ্ট ধারণা পূরণ করতে হবে পারে। তারা অবশ্যই সমর্থন operator++
এবং dereferencesable হতে হবে।
দ্য রোড টু কনসেপ্টস
সীমাবদ্ধতা সি ++ এর সম্পূর্ণ ধারণা বৈশিষ্ট্যের দিকে প্রথম ধাপ first এগুলি একটি অত্যন্ত গুরুত্বপূর্ণ পদক্ষেপ, কারণ এগুলি স্ট্যাটিকালি প্রয়োগযোগ্য প্রকারের প্রয়োজনীয়তা সরবরাহ করে যাতে আমরা অনেক ক্লিনার টেম্পলেট এবং ক্লাস লিখতে পারি। এখন আমরা এর জটিলতা এবং কৌতূহল std::enable_if
এবং এর রূপক বন্ধুদের বন্ধুদের এড়াতে পারি ।
তবে, বেশ কয়েকটি জিনিস রয়েছে যা সীমাবদ্ধতার প্রস্তাবনা করে না:
এটি কোনও ধারণার সংজ্ঞা ভাষা সরবরাহ করে না।
সীমাবদ্ধতা ধারণা মানচিত্র নয়। ব্যবহারকারীর নির্দিষ্ট বাধা পূরণের জন্য তাদের প্রকারটি নির্দিষ্ট করে উল্লেখ করার দরকার নেই। এগুলি স্থিরভাবে ব্যবহৃত সহজ সংকলন-ভাষা বৈশিষ্ট্যগুলি পরীক্ষিত হয়।
টেমপ্লেটগুলির বাস্তবায়নগুলি তাদের টেম্পলেট আর্গুমেন্টের দ্বারা সীমাবদ্ধ নয়। এটি হ'ল, যদি আপনার ফাংশন টেম্পলেটটি বাধাবদ্ধ কোনও ধরণের অবজেক্টের সাথে এমন কিছু করে যা এটি করা উচিত নয়, তবে সংকলকটি এটি সনাক্ত করার কোনও উপায় নেই। একটি সম্পূর্ণ বৈশিষ্ট্যযুক্ত ধারণা প্রস্তাব এটি করতে সক্ষম হবে।
সীমাবদ্ধতার প্রস্তাবটি বিশেষভাবে তৈরি করা হয়েছে যাতে এটির উপরে একটি সম্পূর্ণ ধারণা প্রস্তাব প্রবর্তন করা যায়। কোনও ভাগ্যের সাথেই, সেই রূপান্তরটি মোটামুটি মসৃণ যাত্রা হওয়া উচিত। ধারণাগুলি গোষ্ঠী সি ++ ১৪ (বা খুব শীঘ্রই কোনও প্রযুক্তিগত প্রতিবেদনে) জন্য সীমাবদ্ধতাগুলি প্রবর্তন করতে চাইছে, যখন পুরো ধারণাটি সি ++ 17 এর কাছাকাছি সময়ে উদ্ভূত হতে পারে।