আপনি যা করতে চান তা সর্বদা বর্ণনা করে এমন বৈকল্পিকটি ব্যবহার করুন । এটাই
প্রতিটি উপাদান x
জন্য vec
, না bar.process(x)
।
এখন, উদাহরণগুলি পরীক্ষা করা যাক:
std::for_each(vec.begin(), vec.end(),
std::bind1st(std::mem_fun_ref(&Bar::process), bar));
আমরা একটি আছে for_each
কিনা, সে - yippeh । আমাদের যে [begin; end)
পরিসরটি পরিচালনা করতে চাই তা আমাদের রয়েছে।
নীতিগতভাবে, অ্যালগরিদম হ'ল লিখিত বাস্তবায়নের চেয়ে অনেক বেশি স্পষ্ট এবং এভাবে পছন্দনীয় ছিল। তবে কি ... বাইন্ডার? Memfun? মূলত সি ++ ইন্টার্না কিভাবে সদস্য ফাংশন ধরে রাখবেন? আমার কাজের জন্য, আমি তাদের সম্পর্কে চিন্তা করি না ! আমি এই ভার্বোস, ক্রাইপি সিনট্যাক্সেও ভুগতে চাই না।
এখন অন্য সম্ভাবনা:
for (std::vector<Foo>::const_iterator it = vec.begin(); it != vec.end(); ++it)
{
bar.process(*it);
}
মঞ্জুর, এটি স্বীকৃতি দেওয়ার জন্য একটি সাধারণ প্যাটার্ন, তবে ... পুনরাবৃত্তকারী তৈরি করা, লুপিং, ইনক্রিমেন্টিং, ডিরেফারেন্সিং। এগুলিও আমার কাজটি সম্পাদন করার জন্য আমার যত্ন নেই things
স্বীকার করা যায়, এটি প্রথম সমাধানের চেয়ে অপেক্ষাকৃত ভাল দেখায় (কমপক্ষে, লুপের দেহটি নমনীয় এবং বেশ স্পষ্ট) তবে তবুও এটি আসলে এত দুর্দান্ত নয়। আমাদের যদি আরও ভাল সম্ভাবনা না থাকে তবে আমরা এটি ব্যবহার করব, তবে আমাদের সম্ভবত ...
একটি ভাল উপায়?
এখন ফিরে for_each
। এটি করা অপারেশনটিতে আক্ষরিকভাবে বলা for_each
এবং নমনীয় হওয়া কি দুর্দান্ত হবে না? ভাগ্যক্রমে, যেহেতু সি ++ 0 এক্স ল্যাম্বডাস, আমরা আছি
for_each(v.begin(), v.end(), [&](const Foo& x) { bar.process(x); })
এখন যেহেতু আমরা অনেকগুলি সম্পর্কিত পরিস্থিতিতে একটি বিমূর্ত, জেনেরিক সমাধান খুঁজে পেয়েছি, এটি লক্ষণীয় যে এই বিশেষ ক্ষেত্রে একটি পরম # 1 প্রিয় রয়েছে :
foreach(const Foo& x, vec) bar.process(x);
এটি এর চেয়ে বেশি পরিষ্কার হতে পারে না। ধন্যবাদ, সি ++ 0 এক্স অন্তর্নির্মিত অনুরূপ সিনট্যাক্সের মত !
map(bar.process, vec)
যদিও পার্শ্ব প্রতিক্রিয়াগুলির জন্য মানচিত্রটি নিরুৎসাহিত করা হয় এবং মানচিত্রের উপরে তালিকা বোঝার / জেনারেটরের এক্সপ্রেশন প্রস্তাবিত হয়)।