Gcc 4.6 kullanıyorum. Değişken bir fonksiyona geçmek zorunda olduğum bir vektör v vektörünün olduğunu varsayalım (const char * format, ...).Geçiş std :: vector <int> öğeleri variadic işlevi
Bunu yapmanın bir yaklaşımdır.
void VectorToVarArgs(vector<int> &v)
{
switch(v.size())
{
case 1: f("%i", v[0]);
case 2: f("%i %i", v[0], v[1]);
case 3: f("%i %i %i", v[0], v[1], v[2]);
case 4: f("%i %i %i %i", v[0], v[1], v[2], v[3]);
// etc...
default:
break;
}
}
// where function f is
void f(const char* format, ...)
{
va_list args;
va_start (args, format);
vprintf (format, args);
va_end (args);
}
sorun vektör v öğelerin rastgele sayıda desteklemediği elbette Ancak, ben de işleri va_lists nasıl anlamış inandığımız ilke, , yani "...", 'dan önceki son argüman adresinden başlayarak yığındaki argümanları okuyarak Şimdi vektör öğesi değerlerini bir bellek bloğuna kopyalamanın mümkün olacağını düşündüm (örn. myMemBlock ve adres 'format' sonra ikinci argüman olarak iletir. Açıkçası bu, myMemBlock'un f(), yani bir yığın gibi beklendiği gibi yapılandırılmasını gerektirir.
- Böyle bir şey yapılabilir mi?
- Alternatif olarak, vektör öğesi değerlerini gerçek yığın üzerinde bazı satır içi sihirbaz sihirbazı, çağrı işlevi f() ile itip mümkün olur mu?
Son olarak, işler Ben umurumda değil:
- kod taşınabilir değildir olabilir. Tamam sadece gcc ile ilgileniyorum.
- Önişlemci korsanlığı ile ilgili başka yaklaşımlar olabilir.
- printf() gibi biçimlendirme için varadik işlevlerin kullanımı C++ için önerilmez.
- Değişken şablon işlevlerinin kullanımı.
Bildiğim kadarıyla kendi va_arg listenizi "oluşturmak" mümkün değildir. Yapabilecekleriniz, doğrudan f() işlevinizi aşırı yükleyerek vektörü geçirmektir. – Gui13
Va_arg'ı yeniden oluşturmak istemiyorum, sadece çalışmam için va_arg için bir yığın taklit etmek istiyorum. – user1142580