Variadic bir fonksiyondaki tüm argümanlarda std :: forward nasıl çağrılır?


115

Ben sadece genel bir nesne fabrikası yazıyordum ve değişken bir şablon oluşturmak için boost önişlemci meta kitaplığını kullanıyordum (2010 kullanıyorum ve bu onları desteklemiyor). Fonksiyonum rval referansları kullanıyor ve std::forwardmükemmel yönlendirme yapmak için beni düşündürdü ... C ++ 0X çıktığında ve standart bir derleyicim olduğunda bunu gerçek değişken şablonlarla yapardım. Yine de, std::forwardtartışmalara başvurabilir miyim?

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

Aklıma gelen tek yol, parametrelerin manuel olarak açılmasını gerektirebilir ve ben de henüz tam olarak orada değilim. İşe yarayacak daha hızlı bir sözdizimi var mı?

Yanıtlar:


162

Yapacaksın:

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

...Hemen hemen "solda ne almak ve her şablon parametresi için, buna göre açmaktır." Diyor


1
Buna parametrelerin nasıl geçirilmesi gerektiğini ekleyin. Sanırım öğreticiler gösteriyorvoid f(Params&& ...params)
UncleBens

87
Korsan gibi konuştuğumda kullanıyorumvoid f(Ar&& ...arg)
woolstar

Lütfen rvalue referansı && seçiminin motivasyonunu açıklayın (& referans yerine veya duruma bağlı olarak sadece değere göre)
DavidJ

@DavidJ Motivasyonu soruya ekledim. Bununla birlikte bkz: stackoverflow.com/questions/3582001/advantages-of-using-forward
GManNickG
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.