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&>(ostringstream() << t).str(); }
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); }
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 { };
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!