জিসিসি ৪.৮.০ প্রকাশিত হওয়ার সাথে সাথে আমাদের একটি সংকলক রয়েছে যা স্বয়ংক্রিয়ভাবে রিটার্ন টাইপ ছাড়ের সমর্থন করে, সি ++ ১৪ এর অংশ। সহ -std=c++1y
, আমি এটি করতে পারি:
auto foo() { //deduced to be int
return 5;
}
আমার প্রশ্ন: আমি কখন এই বৈশিষ্ট্যটি ব্যবহার করব? এটি কখন প্রয়োজনীয় এবং কখন কোড ক্লিনার করে?
দৃশ্যপট 1
আমি যে প্রথম দৃশ্যের কথা ভাবতে পারি তা যখনই সম্ভব হয়। এভাবে লেখা যায় এমন প্রতিটি ফাংশন হওয়া উচিত। এটির সাথে সমস্যাটি হ'ল এটি সর্বদা কোডটিকে আরও পঠনযোগ্য করে তুলবে না।
দৃশ্য 2
পরবর্তী পরিস্থিতিটি আরও জটিল রিটার্নের ধরন এড়ানো। খুব হালকা উদাহরণ হিসাবে:
template<typename T, typename U>
auto add(T t, U u) { //almost deduced as decltype(t + u): decltype(auto) would
return t + u;
}
আমি বিশ্বাস করি না যে এটি আসলেই কোনও সমস্যা হয়ে উঠবে, যদিও আমি অনুমান করি যে রিটার্নের ধরণটি স্পষ্টভাবে পরামিতিগুলির উপর নির্ভর করে কিছু ক্ষেত্রে আরও পরিষ্কার হতে পারে।
পরিস্থিতি 3
অপ্রয়োজনীয়তা রোধ করতে পরবর্তী:
auto foo() {
std::vector<std::map<std::pair<int, double>, int>> ret;
//fill ret in with stuff
return ret;
}
সি ++ ১১-এ, আমরা কখনও কখনও কেবল return {5, 6, 7};
কোনও ভেক্টরের জায়গায় রাখতে পারি, তবে এটি সর্বদা কার্যকর হয় না এবং আমাদের ফাংশন শিরোনাম এবং ফাংশন বডি উভয় প্রকারের নির্দিষ্ট করতে হবে। এটি নিখুঁতভাবে অপ্রয়োজনীয় এবং স্বয়ংক্রিয় রিটার্নের ধরণের ছাড় আমাদের সেই অপ্রয়োজনীয়তা থেকে বাঁচায়।
দৃশ্য 4
অবশেষে, এটি খুব সাধারণ ফাংশনের জায়গায় ব্যবহার করা যেতে পারে:
auto position() {
return pos_;
}
auto area() {
return length_ * width_;
}
কখনও কখনও, যদিও আমরা সঠিক প্রকারটি জানতে চেয়ে আমরা ফাংশনটি দেখতে পারি এবং এটি যদি এখানে সরবরাহ না করা হয় তবে আমাদের কোডের অন্য একটি বিন্দুতে যেতে হবে, যেখানে pos_
কোথায় ঘোষিত হয়েছে।
উপসংহার
এই পরিস্থিতিগুলি নির্দিষ্ট করে দিয়ে, তাদের মধ্যে কোনটি এমন পরিস্থিতি হিসাবে প্রমাণিত হয় যেখানে কোডটি ক্লিনার তৈরিতে এই বৈশিষ্ট্যটি কার্যকর? আমি এখানে উল্লেখ করতে অবহেলা করা পরিস্থিতি সম্পর্কে কী? এই বৈশিষ্ট্যটি ব্যবহার করার আগে আমার কী সাবধানতা অবলম্বন করা উচিত যাতে এটি আমাকে পরে কামড়ায় না? এই বৈশিষ্ট্যটি টেবিলটিতে এমন নতুন কিছু এনেছে যা এটি ছাড়া সম্ভব নয়?
নোট করুন যে একাধিক প্রশ্ন বোঝার জন্য দৃষ্টিকোণগুলি অনুসন্ধান করার জন্য এটি থেকে কোন উত্তর দেওয়া উচিত।
->decltype(t+u)
অটো ছাড়ের পরিবর্তে SFINAE কে হত্যা করা হয়।