Saat mencoba mencari urutan optimal untuk parameter opsional ke suatu fungsi baru-baru ini, saya sengaja menemukan posting blog ini dan menyertai repo GitHub , yang menyediakan header untuk kwargs
fasilitas mirip- Pythonic di C ++. Meskipun akhirnya saya tidak menggunakannya, saya bertanya-tanya apakah ini bagus atau tidak dalam bahasa yang sangat diketik. Setelah bekerja di Python untuk sementara waktu, saya menemukan gagasan tentang kwargs
fasilitas seperti-di proyek saya sangat menarik karena banyak objek / fungsinya memiliki sejumlah parameter opsional (sayangnya, tidak dapat dihindari,), menghasilkan daftar panjang konstruktor yang berbeda dengan satu atau dua parameter dan bisa dibuat lebih ringkas / KERING-ish.
Apa, jika ada, pengalaman orang lain dengan hal-hal seperti ini? Haruskah itu dihindari? Apakah ada pedoman untuk itu? Apa potensi masalah / jebakan?
Jawaban:
Saya tidak terlalu mengenal C ++ kwargs tetapi beberapa kerugian muncul di pikiran setelah membaca sepintas sumber mereka:
Mereka membutuhkan secara global pra-deklarasi semua argumen . Contoh sederhana pada posting blog memiliki bagian ini yang beratnya mati:
Tidak sesingkat aslinya pythonic.
C ++ menawarkan alternatif asli untuk mencapai fungsi parameter bernama:
Pembungkus Struct . Tentukan parameter opsional Anda sebagai bidang struct.
Objek proxy . Argumen disimpan dalam struct sementara yang dapat dimodifikasi dengan setter berantai.
Catatan : pelat boiler dapat diabstraksi menjadi makro dengan mengorbankan keterbacaan:
Fungsi variadik . Ini jelas tipe tidak aman dan membutuhkan pengetahuan tentang promosi tipe untuk mendapatkan yang benar. Namun, ini tersedia dalam C murni jika C ++ bukan pilihan.
Catatan : Di C ++ ini bisa dibuat aman dengan template variadic. Run-time overhead akan hilang dengan mengorbankan waktu kompilasi yang lebih lambat dan mengasapi biner.
boost :: parameter . Masih perpustakaan pihak ketiga, meskipun lib lebih mapan daripada beberapa repo github jelas. Kelemahan: template-berat.
Pada catatan penutup, saya tidak akan menggunakan pustaka kwargs ini hanya karena ada sejumlah alternatif yang cukup baik di C ++ untuk mencapai hal yang sama. Saya pribadi akan memilih 1. atau 2. dari daftar (tidak lengkap) di atas.
sumber
private
? Membuatnyapublic
berarti mereka dapat memanggil fungsi atau mengatur variabel secara langsung.struct foo
membuang hanya untuk meniru sintaks fungsi Python asli; melewati nilai-nama dalam satu baris di situs panggilan. Mereka bisa sajapublic
tetapi bukan itu intinya di sini.