কেন এটি কাজ করে না
আমি আশা করি যে 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
কোনও ফ্রি ফাংশন বা সদস্য ফাংশন নির্বিশেষে এটি কাজ করবে ।