Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Templat fungsi C++ digabungkan dengan SFINAE (jenis terbitan gagal sah)?

Templat fungsi C++ digabungkan dengan SFINAE (jenis terbitan gagal sah)?

WBOY
WBOYasal
2024-04-15 11:39:01892semak imbas

Templat Fungsi Digunakan bersama SFINAE untuk mencipta fungsi generik dan melaraskan gelagat fungsi berdasarkan jenis parameter templat. SFINAE membolehkan kami mengawal ketersediaan fungsi berdasarkan sama ada potongan jenis parameter templat gagal. Apabila digunakan bersama, templat fungsi boleh memperhalusi gelagat berdasarkan kekangan jenis, seperti membezakan antara jenis integer dan bukan integer, tidak termasuk jenis boolean, dsb., menghasilkan kod yang fleksibel dan selamat jenis.

C++ 函数模板与 SFINAE(类型推导失败有效)的结合使用?

Menggunakan templat fungsi C++ dengan SFINAE

Pengenalan

Templat fungsi C++ membolehkan kami mencipta fungsi generik yang berfungsi pada pelbagai jenis. Walau bagaimanapun, dalam beberapa kes kami mungkin ingin memperhalusi tingkah laku fungsi berdasarkan jenis parameter templat. Di sinilah SFINAE (Type Deduction Failed Efficient) masuk.

SFINAE

SFINAE ialah teknik yang membolehkan kita menentukan ketersediaan fungsi berdasarkan kehadiran atau ketiadaan jenis parameter templat. Jika hujah templat tidak dapat disimpulkan, pengkompil akan melaporkan kegagalan derivasi, yang boleh kita gunakan untuk mengawal ketersediaan fungsi.

Gabungan penggunaan templat fungsi C++ dan SFINAE

Kami boleh melanjutkan fungsi templat fungsi dengan menggunakan SFINAE. Mari lihat contoh:

template <typename T>
typename std::enable_if<std::is_integral<T>::value, void>::type func(T x) {
  // Integral type-specific implementation
}

template <typename T>
typename std::enable_if<!std::is_integral<T>::value, void>::type func(T x) {
  // Non-integral type-specific implementation
}

Dalam contoh ini, kami mencipta templat fungsi func dan memilih tandatangan fungsi yang berbeza berdasarkan jenis parameter templat T. Menggunakan std::enable_if, kami mencipta dua fungsi bersarang yang hanya tersedia apabila kekangan jenis tertentu dipenuhi. Untuk jenis integer, fungsi pertama akan dipanggil, dan untuk jenis bukan integer, fungsi kedua akan dipanggil. func,根据模板参数 T 的类型选择不同的函数签名。使用 std::enable_if,我们创建两个嵌套函数,它们仅在满足特定类型约束时可用。对于整数类型,将调用第一个函数,对于非整数类型,将调用第二个函数。

实战案例

以下是一个 C++ 函数模板与 SFINAE 结合使用的实际案例:

// 实现求平方和的函数模板
template <typename T>
auto sum_of_squares(const std::vector<T>& v) {
  typename std::enable_if<!std::is_same<T, bool>::value, decltype(v[0]*v[0])>::type result = T{};

  for (const auto& elem : v)
    result += elem * elem;

  return result;
}

在这个案例中,我们创建了一个函数模板 sum_of_squares

Kes praktikal

Berikut ialah kes praktikal menggunakan templat fungsi C++ dengan SFINAE:

rrreee

Dalam kes ini, kami mencipta templat fungsi jumlah_kuadrat yang akan menyelesaikan vektor Jumlah segi empat sama semua unsur. Menggunakan SFINAE, kami mengecualikan jenis Boolean kerana ia tidak menyokong operasi segi empat sama. 🎜🎜🎜Kesimpulan🎜🎜🎜Templat fungsi C++ digabungkan dengan SFINAE menyediakan alat berkuasa yang boleh membantu kami mencipta kod generik yang fleksibel dan selamat jenis. Dengan memanfaatkan jenis parameter templat, kami boleh memperhalusi gelagat fungsi pada masa jalan berdasarkan kekangan jenis. Ini membolehkan kami menulis kod yang cekap dan berskala. 🎜

Atas ialah kandungan terperinci Templat fungsi C++ digabungkan dengan SFINAE (jenis terbitan gagal sah)?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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