Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Melaksanakan Fungsi Templat Yang Memilih Pelaksanaannya Berdasarkan Ketersediaan std::to_string?

Bagaimana untuk Melaksanakan Fungsi Templat Yang Memilih Pelaksanaannya Berdasarkan Ketersediaan std::to_string?

Linda Hamilton
Lepaskan: 2024-11-09 08:25:02
asal
694 orang telah melayarinya

How to Implement a Template Function That Selects Its Implementation Based on the Availability of std::to_string?

Metaprogramming: Menyimpulkan Definisi Fungsi Berdasarkan Ketersediaan Jenis

Dalam konteks pengaturcaraan meta templat, adalah perlu untuk mentakrifkan templat berdasarkan kriteria tertentu . Dalam senario khusus ini, objektifnya adalah untuk mentakrifkan templat yang memilih pelaksanaannya berdasarkan sama ada fungsi to_string terlampau ditakrifkan untuk jenis tertentu.

Percubaan awal ialah menggunakan is_arithmetic sebagai kriteria pemilihan:

template<typename T> enable_if_t<is_arithmetic<T>::value, string> stringify(T t){
    return to_string(t);
}
Salin selepas log masuk

Walau bagaimanapun, to_string mungkin tidak tersedia untuk jenis bukan aritmetik, yang membawa kepada keperluan untuk templat tambahan:

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

Cabaran timbul dalam menentukan kriteria pemilihan templat untuk kes itu di mana to_string tidak tersedia. Percubaan berikut tidak berjaya:

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 memanfaatkan ciri jenis void_t yang diperkenalkan oleh Walter Brown, yang membolehkan kami mentakrifkan ciri jenis yang menyemak kewujudan fungsi:

template <typename...>
using void_t = void;
Salin selepas log masuk

Dengan menggunakan ini, kita boleh membina ciri jenis yang diingini seperti berikut:

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

Dengan ciri jenis ini, kita kemudiannya boleh menentukan templat yang memilih pelaksanaannya berdasarkan ketersediaan to_string:

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

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

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Fungsi Templat Yang Memilih Pelaksanaannya Berdasarkan Ketersediaan std::to_string?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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