Jadi saya punya 2 fungsi yang keduanya memiliki argumen yang mirip
void example(int a, int b, ...);
void exampleB(int b, ...);
Sekarang example
panggilan exampleB
, tapi bagaimana saya bisa meneruskan variabel dalam daftar argumen variabel tanpa memodifikasi exampleB
(karena ini sudah digunakan di tempat lain juga).
c++
variadic-functions
Tidak tersedia
sumber
sumber
Jawaban:
Anda tidak dapat melakukannya secara langsung; Anda harus membuat fungsi yang membutuhkan
va_list
:sumber
, ...
tanda tangan. Jika Anda telah mengonversi argumen variabel menjadi ava_list
, Anda bisa meneruskanva_list
ke fungsi lain yang hanya membutuhkan ava_list
, tetapi fungsi itu (atau yang dipanggilnya) harus memiliki cara untuk mengetahui apa yang ada diva_list
.Mungkin melempar batu ke kolam di sini, tetapi tampaknya bekerja cukup baik dengan template variadic C ++ 11:
Setidaknya, ini berfungsi dengan
g++
.sumber
args...
Anda harus membuat versi fungsi ini yang mengambil va_list, dan meneruskannya. Lihat
vprintf
sebagai contoh:sumber
Saya juga ingin membungkus printf dan menemukan jawaban yang membantu di sini:
Cara melewatkan sejumlah variabel argumen ke printf / sprintf
Saya sama sekali tidak tertarik dengan kinerja (saya yakin potongan kode ini dapat ditingkatkan dalam beberapa cara, silakan melakukannya :)), ini hanya untuk pencetakan debug umum jadi saya melakukan ini:
yang kemudian bisa saya gunakan seperti ini
C ++ ostreams indah dalam beberapa aspek, tetapi praktis menjadi mengerikan jika Anda ingin mencetak sesuatu seperti ini dengan beberapa string kecil seperti tanda kurung, titik dua, dan koma yang disisipkan di antara angka-angka tersebut.
sumber
Kebetulan, banyak implementasi C memiliki variasi v? Printf internal yang IMHO seharusnya menjadi bagian dari standar C. Detail pastinya bervariasi, tetapi implementasi tipikal akan menerima struct yang berisi penunjuk fungsi keluaran karakter dan informasi yang mengatakan apa yang seharusnya terjadi. Ini memungkinkan printf, sprintf, dan fprintf untuk semua menggunakan mekanisme 'inti' yang sama. Misalnya, vsprintf mungkin seperti ini:
Fungsi core_printf kemudian memanggil p_inf-> func untuk setiap karakter yang akan menjadi keluaran; fungsi keluaran kemudian dapat mengirim karakter ke konsol, file, string, atau yang lainnya. Jika implementasi seseorang mengekspos fungsi core_printf (dan mekanisme pengaturan apa pun yang digunakannya), seseorang dapat memperluasnya dengan segala macam variasi.
sumber
Cara yang mungkin adalah menggunakan #define:
sumber
Berdasarkan komentar yang Anda bungkus
vsprintf
, dan ini ditandai sebagai C ++ Saya sarankan untuk tidak mencoba melakukan ini, tetapi ubah antarmuka Anda untuk menggunakan C ++ iostreams sebagai gantinya. Mereka memiliki keunggulan dibandingkan fungsiprint
garis, seperti keamanan tipe dan mampu mencetak item yangprintf
tidak dapat ditangani. Beberapa pengerjaan ulang sekarang dapat menghemat banyak rasa sakit di masa depan.sumber
Dengan menggunakan standar C ++ 0x baru, Anda mungkin dapat menyelesaikan ini menggunakan template variadic atau bahkan mengonversi kode lama itu ke sintaks template baru tanpa merusak apa pun.
sumber
Ini adalah satu-satunya cara untuk melakukannya .. dan cara terbaik untuk melakukannya juga ..
sumber