Bagaimana untuk Menentukan Ciri Jenis untuk Ketersediaan Fungsi dalam C?

Mary-Kate Olsen
Lepaskan: 2024-11-09 10:48:02
asal
743 orang telah melayarinya

How to Define a Type Trait for Function Availability in C  ?

Metaprogramming: Kegagalan Definisi Fungsi C sebagai Definisi Fungsi Asing

Dalam C , adalah mungkin untuk mentakrifkan metafungsi berdasarkan ciri jenis. Sebagai contoh, seseorang boleh menentukan templat untuk menukar nilai kepada rentetan berdasarkan sama ada jenis nilai adalah aritmetik:

template<typename T> 
enable_if_t<is_arithmetic<T>::value, string> stringify(T t){
    return to_string(t);
}
template<typename T> 
enable_if_t<!is_arithmetic<T>::value, string> stringify(T t){
    return static_cast<ostringstream&amp;>(ostringstream() << t).str();
}
Salin selepas log masuk

Pendekatan ini, walau bagaimanapun, bergantung pada sifat is_aritmetik jenis tersebut. Pendekatan yang lebih diingini adalah berdasarkan ketersediaan fungsi std::to_string untuk jenis tersebut. Walau bagaimanapun, adalah mencabar untuk menyatakan keperluan berikut sebagai ciri jenis:

"Jika std::to_string ditakrifkan untuk jenis, gunakannya."

Adalah mungkin untuk mengisytiharkan kriteria untuk std ::to_string availability:

template<typename T> 
decltype(to_string(T{})) stringify(T t){
    return to_string(t);
}
Salin selepas log masuk

Tetapi tidak jelas cara membina kriteria yang bertentangan.

Menggunakan sifat void_t Walter Brown, mudah untuk menentukan sifat jenis yang diingini:

template<typename T, typename = void>
struct has_to_string
: std::false_type { };

template<typename T>
struct has_to_string<T, 
    void_t<decltype(std::to_string(std::declval<T>()))>> 
: std::true_type { };
Salin selepas log masuk

Sifat ini menilai sama ada fungsi std::to_string ditakrifkan untuk jenis tertentu, membenarkan pemilihan templat yang lebih fleksibel berdasarkan ketersediaan fungsi.

Atas ialah kandungan terperinci Bagaimana untuk Menentukan Ciri Jenis untuk Ketersediaan Fungsi dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan