Mengapa argumen templat default hanya diizinkan pada templat kelas? Mengapa kita tidak bisa mendefinisikan tipe default di templat fungsi anggota? Sebagai contoh:
struct mycclass {
template<class T=int>
void mymember(T* vec) {
// ...
}
};
Sebaliknya, C ++ memaksa argumen templat default hanya diizinkan pada templat kelas.
struct S { template <class R = int> R get_me_R() { return R(); } };
Parameter template tidak dapat disimpulkan dari konteksnya.template <int N = 1> int &increment(int &i) { i += N; return i; }
, dan kemudianincrement(i);
atauincrement<2>(i);
. Karena itu, saya harus menulisincrement<1>(i);
.Jawaban:
Masuk akal untuk memberikan argumen templat default. Misalnya, Anda dapat membuat fungsi pengurutan:
C ++ 0x memperkenalkan mereka ke C ++. Lihat laporan cacat ini oleh Bjarne Stroustrup: Argumen Templat Default untuk Templat Fungsi dan apa yang dia katakan
sumber
double
dalam kasus saya). Mungkin ini bukan "umum", tetapi apakah ada kelemahan dengan praktik ini? Terima kasih.error: invalid conversion from ‘int’ to ‘int*’
, ada ide mengapa: `#include <array> #include <algorithm> #include <functional> template <typename Iterator, ketik nama Comp = std :: less <Iterator>> void my_sort ( Iterator mohon, Iterator akhir, Comp c = Comp ()) {std :: sort (mohon, end, c); } int main () {std :: array <int, 5> ar {5,2,21,7,4}; my_sort (ar.begin (), ar.end ()); ``Mengutip Template C ++: Panduan Lengkap (halaman 207):
sumber
Sejauh ini, semua contoh parameter templat default yang disodorkan untuk templat fungsi dapat dilakukan dengan kelebihan beban.
AraK:
bisa jadi:
Saya sendiri:
bisa jadi:
litb:
bisa jadi:
Stroustrup:
Bisa jadi:
Yang saya buktikan dengan kode berikut:
Output yang dicetak cocok dengan komentar untuk setiap panggilan ke f, dan panggilan yang dikomentari gagal untuk mengkompilasi seperti yang diharapkan.
Jadi saya menduga bahwa parameter templat default "tidak diperlukan", tetapi mungkin hanya dalam arti yang sama bahwa argumen fungsi default "tidak diperlukan". Seperti yang ditunjukkan oleh laporan cacat Stroustrup, penambahan parameter yang tidak dideduksikan sudah terlambat bagi siapa pun untuk menyadari dan / atau benar-benar menghargai bahwa itu membuat default berguna. Jadi situasi saat ini berlaku berdasarkan versi templat fungsi yang tidak pernah standar.
sumber
template<typename T = void> int SomeFunction();
. Parameter templat di sini tidak pernah digunakan, dan sebenarnya fungsinya tidak pernah dipanggil; satu-satunya tempat yang dimaksud adalah dalamdecltype
atausizeof
. Nama sengaja cocok dengan nama fungsi lain tetapi kenyataannya itu adalah template berarti kompiler akan lebih memilih fungsi gratis jika ada. Keduanya digunakan di SFINAE untuk memberikan perilaku default di mana definisi fungsi tidak ada.Pada Windows, dengan semua versi Visual Studio Anda dapat mengubah kesalahan ini ( C4519 ) menjadi peringatan atau menonaktifkannya seperti ini:
Lihat lebih detail di sini .
sumber
Apa yang saya gunakan adalah trik selanjutnya:
Katakanlah Anda ingin memiliki fungsi seperti ini:
Anda tidak akan diizinkan, tetapi saya lakukan selanjutnya:
Jadi dengan cara ini Anda dapat menggunakannya seperti ini:
Seperti yang dapat kita lihat, tidak perlu secara eksplisit mengatur parameter kedua. Mungkin itu akan bermanfaat bagi seseorang.
sumber