template<typename T1, size_t SIZE>
void foo(std::vector<std::array<T1, SIZE>> bar) {
std::cout << "SPECIFIC (array)" << std::endl;
}
এর std::size_t
পরিবর্তে আপনার ব্যবহার করা উচিত int
।
এখানে চালাও
সম্পাদনা করুন:
আসলে, আপনার মন্তব্য এবং কোড সম্পর্কে আমার স্বীকৃতি আমাকে বিষয়টিতে খনন করতে পরিচালিত করেছিল। প্রথম নজরে, একটি স্ট্যান্ডার্ড বিকাশকারী (আমার মতো) সংকলককে রূপান্তর int
করার প্রত্যাশা করে std::size_t
(কারণ তারা উভয়ই অবিচ্ছেদ্য ধরণের এবং অন্তর্নিহিত রূপান্তরকারী খুব তুচ্ছ) এবং void foo(std::vector<std::array<T1, SIZE>> bar)
সেরা বিশেষজ্ঞ হিসাবে নির্বাচন করুন । সুতরাং টেমপ্লেট যুক্তি ছাড়ের পৃষ্ঠাটি পড়ার সময় আমি এটি খুঁজে পেয়েছি:
যদি পরামিতি তালিকায় একটি নন-টাইপ টেম্পলেট প্যারামিটার ব্যবহার করা হয়, এবং সংশ্লিষ্ট টেম্পলেট যুক্তিটি অনুমিত হয়, তবে অনুমিত টেম্পলেট আর্গুমেন্টের ধরণ (যার সাথে সংযুক্ত টেম্পলেট প্যারামিটার তালিকায় নির্দিষ্ট করা হয়েছে, যার অর্থ রেফারেন্সগুলি সংরক্ষণ করা আছে) অবশ্যই এর ধরণের সাথে মেলে সিভি-কোয়ালিফায়ার বাদ দেওয়া বাদে এবং অ-প্রকারের টেম্পলেট প্যারামিটারটি হুবহু, আর যেখানে টেমপ্লেট আর্গুমেন্টকে অ্যারে বাউন্ড থেকে বাদ দেওয়া হয় except সেই ক্ষেত্রে কোনও অখণ্ড প্রকার অনুমোদিত, এমনকি বুল যদিও এটি সর্বদা সত্য হয়ে যায়:
অবশ্যই সর্বদা হিসাবে, এর অর্থ বোঝার জন্য আপনাকে অবশ্যই একবারের চেয়ে আরও কয়েকবার পড়তে হবে :)
সুতরাং একটি আকর্ষণীয় ফলাফল প্রকাশিত হয়।
ইতিমধ্যে আমাদের কাঙ্ক্ষিত বিশেষত্ব নির্বাচন করা হয়নি তবে কম্পাইলারটি নির্বাচন করতে বাধ্য করা হলে এটি ত্রুটি হবে।
template<typename T1, int SIZE>
void foo(std::vector<std::array<T1, SIZE>> bar) {
std::cout << "SPECIFIC (array)" << std::endl;
}
int main() {
std::vector<std::array<int, 3>> b(2, std::array<int, 3> {4, 5, 6});
foo(b); // P = std::vector<std::array<int,(int)SIZE>
// A = std::vector<std::array<int,(unsigned_long)SIZE>>
// error: deduced non-type template argument does not have the same
// type as its corresponding template argument */
}
রান কোড
আর একটি আকর্ষণীয় বিষয় হ'ল:
যদি নন-টাইপ টেম্পলেট আর্গুমেন্টটি অনুমিত না করা হয়, তবে কোনও বাধা থাকত না যা যুক্তি এবং টেম্পলেট ধরণেরগুলিকে একই হতে বাধ্য করে।
#include <vector>
#include <array>
#include <iostream>
template<typename T1, int SIZE>
void foo(std::vector<std::array<T1, SIZE>> bar) {
std::cout << "SPECIFIC (array)" << std::endl;
}
int main() {
std::vector<std::array<int, 3>> b(2, std::array<int, 3> {4, 5, 6});
foo<int,3>(b);
}
রান কোড
vector
তাদের সকলের উপরের অংশটি সরিয়ে সরল করতে পারেন । এখানে দেখুন