প্রশ্নটি (এবং সর্বাধিক উত্তর) এই ত্রুটি প্রতিবেদনের রেজোলিউশনে পোস্ট করার পরে থেকে মান পরিবর্তন করা হয়েছে ।
for(:)
আপনার ধরণের একটি লুপ কাজ করার X
উপায় এখন দুটি উপায়ের একটি:
সদস্য তৈরি করুন X::begin()
এবং X::end()
এটি এমন কিছু ফেরত দেয় যা পুনরুক্তির মতো কাজ করে
একটি নিখরচায় ফাংশন তৈরি করুন begin(X&)
এবং end(X&)
এটি এমন কিছু প্রত্যাবর্তন করবে যা আপনার টাইপের মতো একই নেমস্পেসে X
পুনরুদ্ধারের মতো কাজ করে ¹
এবং const
প্রকরণের জন্য অনুরূপ । এটি ত্রুটি প্রতিবেদন পরিবর্তনগুলি প্রয়োগ করে এমন সংকলক এবং যেগুলি না করে তাদের উভয়ই কাজ করবে।
প্রত্যাবর্তিত বস্তুগুলিকে আসলে পুনরাবৃত্তকারী হতে হবে না। for(:)
লুপ, C ++ স্ট্যান্ডার্ডের অধিকাংশ অংশের অসদৃশ, তাই কিছু সমতুল্য করতে প্রসারিত করতে নিদিষ্ট :
for( range_declaration : range_expression )
হয়ে:
{
auto && __range = range_expression ;
for (auto __begin = begin_expr,
__end = end_expr;
__begin != __end; ++__begin) {
range_declaration = *__begin;
loop_statement
}
}
যেখানে ভেরিয়েবলগুলি শুরু হয় কেবল __
তা প্রকাশের জন্য হয় এবং begin_expr
এবং end_expr
যাদু বলে begin
/ end
.² বলে ²
প্রারম্ভিক / শেষে ফেরতের মূল্যের প্রয়োজনীয়তাগুলি সহজ: আপনার অবশ্যই প্রি-ওভারলোড ++
করতে হবে, প্রারম্ভিককরণের এক্সপ্রেশনগুলি বৈধ, বাইনারি !=
যা বুলিয়ান প্রসঙ্গে ব্যবহার করা যেতে পারে তা নিশ্চিত করতে হবে, অ্যানারি *
যা আপনাকে নির্দিষ্ট করে দিতে পারে এমন কিছু ফেরত দেয় range_declaration
এবং জনসাধারণকে প্রকাশ করতে পারে বিনাশকারী।
কোনও পুনরুক্তির সাথে সামঞ্জস্যপূর্ণ না এমন উপায়ে করা সম্ভবত একটি খারাপ ধারণা, কারণ সি ++ এর ভবিষ্যতের পুনরাবৃত্তিগুলি যদি আপনার কোডটি ভাঙার ক্ষেত্রে তুলনামূলকভাবে অশ্বারোহী হতে পারে।
একদিকে যেমন, এটি সম্ভবত যুক্তিযুক্ত যে ভবিষ্যতে স্ট্যান্ডার্ডের পুনর্বিবেচনার end_expr
চেয়ে ভিন্ন ধরণের প্রত্যাবর্তনের অনুমতি দেওয়া হবে begin_expr
। এটি দরকারী যেটিতে এটি "অলস-শেষ" মূল্যায়নের (নাল-সমাপ্তি সনাক্তকরণের মতো) অনুমতি দেয় যা হাতের লিখিত সি লুপের মতো দক্ষ হওয়ার জন্য অনুকূলতা তৈরি করা এবং অন্যান্য অনুরূপ অন্যান্য সুবিধার জন্য সহজ।
¹ নোট করুন যে for(:)
লুপগুলি কোনও auto&&
ভেরিয়েবলের মধ্যে কোনও অস্থায়ী সঞ্চয় করে এবং এটি আপনাকে মূল্য হিসাবে চিহ্নিত করে। আপনি কোনও অস্থায়ী (বা অন্য মূল্য) দ্বারা পুনরাবৃত্তি করছেন কিনা তা সনাক্ত করতে পারবেন না; যেমন একটি ওভারলোড একটি দ্বারা কল করা হবে নাfor(:)
লুপ । N4527 থেকে [stmt.ranged] 1.2-1.3 দেখুন।
Ither হয় begin
/ end
পদ্ধতিটি কল করুন , বা সিডি -স্টাইল অ্যারে সমর্থনের জন্য এডিএল-কেবলমাত্র ফাংশন begin
/ এর লকিং / end
, বা যাদু করুন। নোটটি কল করা std::begin
হয় না যদি না range_expression
টাইপ করা বস্তুটি namespace std
একই রকম বা নির্ভর করে returns
ভিতরে C ++ 17 পরিসীমা জন্য অভিব্যক্তি আপডেট করা হয়েছে
{
auto && __range = range_expression ;
auto __begin = begin_expr;
auto __end = end_expr;
for (;__begin != __end; ++__begin) {
range_declaration = *__begin;
loop_statement
}
}
ধরণের __begin
এবং __end
decoupled হয়েছে।
এটি শেষ পুনরাবৃত্তিকে আরম্ভের মতো একই ধরণের না হওয়ার অনুমতি দেয়। আপনার শেষ পুনরাবৃত্তকারী টাইপটি "সেন্ডিনেল" হতে পারে যা কেবল !=
আর্টিনেটর টাইপের সাথে সমর্থন করে।
কেন এই দরকারী একটি ব্যবহারিক উদাহরণ আপনার শেষ পুনরুক্তিকারীর পড়া "আপনার পরীক্ষা করতে পারবেন হয় char*
দেখতে হলে পয়েন্ট '0'
যখন" ==
একটি সঙ্গে char*
। এটি নাল-টার্মিনেটেড char*
বাফারের মাধ্যমে পুনরাবৃত্তি করার সময় একটি সি ++ রেঞ্জের জন্য অভিব্যক্তিটি সর্বোত্তম কোড তৈরি করতে দেয় ।
struct null_sentinal_t {
template<class Rhs,
std::enable_if_t<!std::is_same<Rhs, null_sentinal_t>{},int> =0
>
friend bool operator==(Rhs const& ptr, null_sentinal_t) {
return !*ptr;
}
template<class Rhs,
std::enable_if_t<!std::is_same<Rhs, null_sentinal_t>{},int> =0
>
friend bool operator!=(Rhs const& ptr, null_sentinal_t) {
return !(ptr==null_sentinal_t{});
}
template<class Lhs,
std::enable_if_t<!std::is_same<Lhs, null_sentinal_t>{},int> =0
>
friend bool operator==(null_sentinal_t, Lhs const& ptr) {
return !*ptr;
}
template<class Lhs,
std::enable_if_t<!std::is_same<Lhs, null_sentinal_t>{},int> =0
>
friend bool operator!=(null_sentinal_t, Lhs const& ptr) {
return !(null_sentinal_t{}==ptr);
}
friend bool operator==(null_sentinal_t, null_sentinal_t) {
return true;
}
friend bool operator!=(null_sentinal_t, null_sentinal_t) {
return false;
}
};
সম্পূর্ণ সি ++ 17 সমর্থন ছাড়াই সংকলকটিতে সরাসরি উদাহরণ ; for
লুপটি ম্যানুয়ালি প্রসারিত।
begin/end
বা বন্ধুকে স্থির বা নিখরচায় করেই এটি সম্ভবbegin/end
। : শুধু সতর্কতা অবলম্বন করা আবশ্যক, যা নামস্থানে আপনি বিনামূল্যে ফাংশন করা stackoverflow.com/questions/28242073/...