Bagaimanakah Kami Boleh Melaksanakan Pemilihan Templat Berdasarkan Ketiadaan Fungsi dalam Pemrograman Meta C?

Mary-Kate Olsen
Lepaskan: 2024-11-09 20:36:02
asal
322 orang telah melayarinya

How Can We Implement Template Selection Based on the Absence of a Function in C   Metaprogramming?

Metaprogramming: Pemilihan Templat Berdasarkan Lebihan Fungsi

Dalam pengaturcaraan C, mentakrifkan fungsi templat secara bersyarat berdasarkan sifat jenis ialah teknik biasa. Walau bagaimanapun, dalam beberapa kes, mungkin sukar untuk mentakrifkan senario yang bertentangan, di mana templat dipilih berdasarkan ketiadaan fungsi tertentu.

Secara khusus, dalam contoh yang disediakan, matlamatnya adalah untuk menentukan templat rentetan fungsi yang memilih antara dua pelaksanaan:

  • Jika std::to_string ditakrifkan untuk jenis yang diberikan, gunakan to_string(t) untuk menukar nilai kepada rentetan.
  • Jika std::to_string tidak ditakrifkan untuk jenis, gunakan ostringstream() << t.

Masalah timbul apabila cuba menyatakan keadaan yang terakhir. Percubaan berikut yang tidak berjaya untuk menggunakan templat enable_if bersarang untuk menyemak sama ada to_string tidak ditakrifkan:

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

Untuk menyelesaikan isu ini, kami boleh menggunakan ciri jenis void_t Walter Brown:

template <typename...>
using void_t = void;<p> Menggunakan ini, kita boleh menentukan sifat has_to_string sebagai berikut:</p>
<pre class="brush:php;toolbar:false">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

Kini, templat stringify boleh ditakrifkan menggunakan pengkhususan templat bersyarat berdasarkan sifat has_to_string:

template<typename T>
enable_if_t<has_to_string<T>::value, string> stringify(T t){
    return std::to_string(t);
}

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

Penyelesaian ini secara berkesan memilih pelaksanaan stringify yang sesuai berdasarkan sama ada std::to_string ditakrifkan untuk jenis yang diberikan.

Atas ialah kandungan terperinci Bagaimanakah Kami Boleh Melaksanakan Pemilihan Templat Berdasarkan Ketiadaan Fungsi dalam Pemrograman Meta 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