কেন এটি কাজ করে না
আমি আশা করি যে f()সংকলকটি পুনরাবৃত্তকারী ধরণের মাধ্যমে সমাধান করবে। স্পষ্টতই, এটি (gcc 4.1.2) এটি করে না।
এটা যদি হত তবে দুর্দান্ত হত! তবে for_eachএটি একটি ফাংশন টেম্পলেট, হিসাবে ঘোষণা করা হয়েছে:
template <class InputIterator, class UnaryFunction>
UnaryFunction for_each(InputIterator, InputIterator, UnaryFunction );
UnaryFunctionকলের বিন্দুতে টেমপ্লেট ছাড়ের জন্য একটি প্রকার নির্বাচন করা দরকার । তবে fএকটি নির্দিষ্ট ধরণের নেই - এটি একটি ওভারলোডেড ফাংশন, এখানে fবিভিন্ন ধরণের অনেকগুলি রয়েছে । for_eachটেমপ্লেট ছাড়ের প্রক্রিয়াটি যা fচান তা বলে সহায়তা করার জন্য এখনকার কোনও উপায় নেই , সুতরাং টেমপ্লেট ছাড়গুলি কেবল ব্যর্থ হয়। টেমপ্লেট ছাড়ের সাফল্য পাওয়ার জন্য, আপনাকে কল সাইটে আরও কাজ করতে হবে।
এটি ঠিক করার জেনেরিক সমাধান
কয়েক বছর এবং এখানে C ++ 14 পরে প্রত্যাশী। একটি ব্যবহার করার পরিবর্তে static_cast(যা fআমরা ব্যবহার করতে চাই যা "ফিক্সিং" দ্বারা টেমপ্লেট ছাড়ের সাফল্যের মঞ্জুরি দেয় , তবে আপনাকে সঠিকভাবে "ফিক্স" করতে ওভারলোড রেজোলিউশনটি ম্যানুয়ালি করা প্রয়োজন), আমরা আমাদের জন্য সংকলকটি কাজ করতে চাই। আমরা fকিছু আরগ কল করতে চাই । সবচেয়ে সাধারণ উপায়ে সম্ভব, এটি:
[&](auto&&... args) -> decltype(auto) { return f(std::forward<decltype(args)>(args)...); }
এটি টাইপ করার মতো অনেক কিছুই, তবে এই ধরণের সমস্যাটি বিরক্তিকরভাবে ঘন ঘন ঘন হয়ে আসে, তাই আমরা কেবল এটি ম্যাক্রো (দীর্ঘশ্বাস) এ গুটিয়ে রাখতে পারি:
#define AS_LAMBDA(func) [&](auto&&... args) -> decltype(func(std::forward<decltype(args)>(args)...)) { return func(std::forward<decltype(args)>(args)...); }
এবং তারপরে এটি ব্যবহার করুন:
void scan(const std::string& s) {
std::for_each(s.begin(), s.end(), AS_LAMBDA(f));
}
এটি আপনার কম্পাইলারটি করতে ইচ্ছুক হ'ল - fনিজের নামে ওভারলোড রেজোলিউশন সম্পাদন করুন এবং সঠিক কাজটি করুন। এটি fকোনও ফ্রি ফাংশন বা সদস্য ফাংশন নির্বিশেষে এটি কাজ করবে ।