Saya memiliki templat fungsi yang membutuhkan banyak jenis input. Dari tipe-tipe itu hanya satu yang memiliki getInt()
fungsi. Karenanya saya ingin kode untuk menjalankan fungsi hanya untuk tipe itu. Mohon saran solusinya. Terima kasih
#include <type_traits>
#include <typeinfo>
class X {
public:
int getInt(){
return 9;
}
};
class Y{
};
template<typename T>
void f(T& v){
// error: 'class Y' has no member named 'getInt'
// also tried std::is_same<T, X>::value
if(typeid(T).name() == typeid(X).name()){
int i = v.getInt();// I want this to be called for X only
}
}
int main(){
Y y;
f(y);
}
type_info
struktur memiliki operator perbandingan kesetaraan , jaditypeid(T) == typeid(X)
harus bekerja juga.if constexpr
dengan kondisiis_same_v<T,X>
.getInt
. Pasti ada beberapa pertanyaan di sini di stackoverflow.com sendiri tentang cara melihat apakah struktur atau kelas memiliki fungsi anggota tertentu, jika Anda hanya mencari sedikit.Jawaban:
Jika Anda ingin dapat memanggil fungsi
f
untuk semua jenis yang memiliki anggota fungsigetInt
, tidak hanyaX
, Anda dapat mendeklarasikan 2 kelebihan fungsif
:untuk tipe yang memiliki
getInt
fungsi anggota, termasuk kelasX
untuk semua jenis lainnya, termasuk kelas
Y
.Solusi C ++ 11 / C ++ 17
Mengingat hal itu, Anda dapat melakukan sesuatu seperti ini:
Lihat langsung .
Harap dicatat bahwa
std::void_t
diperkenalkan di C ++ 17, tetapi jika Anda terbatas pada C ++ 11, maka sangat mudah untuk mengimplementasikannyavoid_t
sendiri:Dan ini adalah versi live C ++ 11 .
Apa yang kita miliki di C ++ 20?
C ++ 20 membawa banyak hal baik dan salah satunya adalah konsep . Hal di atas yang berlaku untuk C ++ 11 / C ++ 14 / C ++ 17 dapat dikurangi secara signifikan dalam C ++ 20:
Lihat langsung .
sumber
void_t
penyebab masalah ke beberapa kompiler lama (seperti yang ditunjukkan oleh tautan).template<typename T> concept HasGetInt = requires (T& v) { {v.getInt()} -> std::convertible_to<int>; };
Anda dapat menggunakan
if constexpr
dari C ++ 17:Sebelumnya, Anda harus menggunakan kelebihan beban dan SFINAE atau pengiriman tag.
sumber
if constexpr
adalah fitur C ++ 17.X
Tetap sederhana dan kelebihan. Telah bekerja sejak setidaknya C ++ 98 ...
Ini cukup jika hanya ada satu jenis dengan
getInt
fungsi. Jika ada lagi, itu tidak lagi sederhana. Ada beberapa cara untuk melakukannya, berikut ini:Contoh langsung dengan hasil diagnostik.
sumber
X
), tetapi, jika ada lebih banyak tipe serupa dengan anggotagetInt
di masa depan, ini bukan praktik yang baik. Anda mungkin ingin mencatat bahwa