Scott Meyers memposting konten dan status buku berikutnya EC ++ 11. Dia menulis bahwa satu item dalam buku itu bisa menjadi "Hindari std::enable_if
dalam tanda tangan fungsi" .
std::enable_if
dapat digunakan sebagai argumen fungsi, sebagai tipe kembali atau sebagai templat kelas atau parameter templat fungsi untuk menghapus fungsi atau kelas secara kondisional dari resolusi kelebihan beban.
Dalam pertanyaan ini ketiga solusi ditampilkan.
Sebagai parameter fungsi:
template<typename T>
struct Check1
{
template<typename U = T>
U read(typename std::enable_if<
std::is_same<U, int>::value >::type* = 0) { return 42; }
template<typename U = T>
U read(typename std::enable_if<
std::is_same<U, double>::value >::type* = 0) { return 3.14; }
};
Sebagai parameter template:
template<typename T>
struct Check2
{
template<typename U = T, typename std::enable_if<
std::is_same<U, int>::value, int>::type = 0>
U read() { return 42; }
template<typename U = T, typename std::enable_if<
std::is_same<U, double>::value, int>::type = 0>
U read() { return 3.14; }
};
Sebagai jenis pengembalian:
template<typename T>
struct Check3
{
template<typename U = T>
typename std::enable_if<std::is_same<U, int>::value, U>::type read() {
return 42;
}
template<typename U = T>
typename std::enable_if<std::is_same<U, double>::value, U>::type read() {
return 3.14;
}
};
- Solusi mana yang lebih disukai dan mengapa saya harus menghindari yang lain?
- Dalam kasus mana "Hindari
std::enable_if
dalam tanda tangan fungsi" menyangkut penggunaan sebagai tipe pengembalian (yang bukan bagian dari tanda tangan fungsi normal tetapi spesialisasi templat)? - Apakah ada perbedaan untuk templat fungsi anggota dan non-anggota?
std::enable_if
kekacauan fungsi tanda tangan saya (terutama jelek tambahan nullptr
versi fungsi argumen) karena selalu tampak seperti apa itu, hack aneh (untuk sesuatu yang static if
kekuatannya lakukan jauh lebih indah dan bersih) menggunakan template black-magic untuk mengeksploitasi fitur bahasa interresting. Inilah sebabnya mengapa saya lebih suka pengiriman tag bila memungkinkan (well, Anda masih memiliki argumen aneh tambahan, tetapi tidak di antarmuka publik dan juga jauh lebih jelek dan samar ).
=0
di typename std::enable_if<std::is_same<U, int>::value, int>::type = 0
capai? Saya tidak dapat menemukan sumber yang tepat untuk memahaminya. Saya tahu bagian pertama sebelum =0
memiliki tipe anggota int
jika U
dan int
sama. Terimakasih banyak!