কীভাবে একজন কল করতে পারেন std :: একটি ভ্যারিয়েডিক ফাংশনে সমস্ত আর্গুমেন্টের দিকে?


114

আমি কেবল একটি জেনেরিক অবজেক্ট ফ্যাক্টরি লিখছিলাম এবং বুস্ট প্রিপ্রোসেসর মেটা-লাইব্রেরিটি ব্যবহার করে একটি বৈকল্পিক টেম্পলেট তৈরি করছিলাম (২০১০ ব্যবহার করে এটি তাদের সমর্থন করে না)। আমার ফাংশনটি যথোপযুক্ত std::forwardফরোয়ার্ডিংয়ের জন্য এবং যথাযথ ফরোয়ার্ডিংয়ের জন্য ব্যবহার করে এবং আমাকে ভাবতে থাকে ... যখন C ++ 0 এক্স আসে এবং আমার কাছে একটি স্ট্যান্ডার্ড সংকলক ছিল আমি সত্যিকারের ভেরিয়েডিক টেম্পলেটগুলির সাথে এটি করতাম। তবে আমি কীভাবে std::forwardযুক্তি জানাব?

template <typename ...Params>
void f(Params... params) // how do I say these are rvalue reference?
{
    y(std::forward(...params)); //? - I doubt this would work.
}

আমি যেভাবেই ভাবতে পারি তার জন্য ... প্যারামগুলির ম্যানুয়াল আনপ্যাকিংয়ের প্রয়োজন হবে এবং আমি এখনও সেখানে উপস্থিত নেই। একটি দ্রুত সিনট্যাক্স আছে যা কাজ করবে?

উত্তর:


161

আপনি করবেন:

template <typename ...Params>
void f(Params&&... params)
{
    y(std::forward<Params>(params)...);
}

...প্রায় কাছাকাছি বলে "নিতে কি বাম, এবং প্রতিটি টেমপ্লেট প্যারামিটার জন্য, এটি সেই অনুযায়ী প্যাকমুক্ত।"


1
পরামিতিগুলি কীভাবে পাস করা উচিত তা যুক্ত করুন। আমার মনে হয় টিউটোরিয়ালগুলি দেখায়void f(Params&& ...params)
আঙ্কেলবেন্স

87
জলদস্যু দিবসের মতো void f(Ar&& ...arg)
আলাপে

অনুগ্রহপূর্বক মূল্যের রেফারেন্স && ((রেফারেন্সের পরিবর্তে বা কেবলমাত্র পরিস্থিতির উপর নির্ভর করে মান দ্বারা)
ডেভিডজে

@ ডেভিডজে আমি প্রেরণাকে প্রশ্নে ফেলেছি বলেছি। তবে দেখুন:
স্ট্যাকওভারফ্লো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.