Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Anda Harus Mengelak Menggunakan `std::enable_if` dalam Jenis Pulangan Fungsi?

Mengapa Anda Harus Mengelak Menggunakan `std::enable_if` dalam Jenis Pulangan Fungsi?

Linda Hamilton
Linda Hamiltonasal
2024-10-31 06:02:30631semak imbas

Why Should You Avoid Using `std::enable_if` in Function Return Types?

Mengapa Berusaha Mengelak std::enable_if dalam Fungsi Tandatangan?

std::enable_if, alat serba boleh dalam C , boleh digunakan dalam pelbagai cara untuk mentakrifkan fungsi atau kelas secara bersyarat berdasarkan kriteria yang ditentukan. Walau bagaimanapun, Scott Meyers telah memberi amaran supaya tidak menggunakannya dalam tandatangan fungsi. Memahami pengesyoran ini memerlukan penerokaan strategi berbeza yang tersedia dengan std::enable_if dan implikasinya.

Pilihan Pelaksanaan:

  1. Parameter Fungsi:
<code class="cpp">template<typename T>
struct Check1
{
    template<typename U = T>
    U read(typename std::enable_if<std::is_same<U, int>::value>::type* = 0) { return 42; }

    template<typename U = T>
    U read(typename std::enable_if<std::is_same<U, double>::value>::type* = 0) { return 3.14; }   
};</code>
  1. Parameter Templat:
<code class="cpp">template<typename T>
struct Check2
{
    template<typename U = T, typename std::enable_if<std::is_same<U, int>::value, int>::type = 0>
    U read() { return 42; }

    template<typename U = T, typename std::enable_if<std::is_same<U, double>::value, int>::type = 0>
    U read() { return 3.14; }   
};</code>
  1. Jenis Pemulangan:
<code class="cpp">template<typename T>
struct Check3
{
    template<typename U = T>
    typename std::enable_if<std::is_same<U, int>::value, U>::type read() {
        return 42;
    }

    template<typename U = T>
    typename std::enable_if<std::is_same<U, double>::value, U>::type read() {
        return 3.14;
    }   
};</code>

Pendekatan Pilihan:

Pendekatan yang paling sesuai ialah meletakkan enable_if dalam parameter templat. Teknik ini menawarkan kelebihan dalam kejelasan dan kepelbagaian.

Kejelasan:

Klausa enable_if boleh dibezakan daripada jenis pemulangan dan hujah, menghasilkan kod yang lebih mudah dibaca. Walaupun dengan penggunaan templat alias untuk mengurangkan kekacauan, klausa yang digabungkan dalam pendekatan lain masih menggabungkan konsep yang berasingan dan berbeza.

Kepelbagaian:

Teknik ini boleh digunakan secara universal digunakan pada pelbagai konteks, termasuk pembina tanpa jenis pulangan dan pengendali yang melarang hujah tambahan. SFINAE, kunci di sebalik tingkah laku bersyarat std::enable_if, hanya terpakai pada templat, seterusnya menyokong kesejagatan pendekatan ini.

Pengelakkan std::enable_if dalam Jenis Pulangan:

Apabila menggunakan std::enable_if dalam jenis balasan, kebimbangan bukan pada tandatangan fungsi tetapi lebih kepada pengkhususan templat. Meyers menasihatkan terhadap amalan ini atas sebab kejelasan dan ketekalan. Menentukan jenis pemulangan dengan enable_if memperkenalkan ketidakkonsistenan antara definisi templat dan templat asas:

<code class="cpp">template<typename T>
struct Check4
{
    typename std::enable_if<std::is_same<T, int>::value, int>::type read() {
        return 42;
    }

    int read() {    // error: redeclared without 'typename'
        return 3.14;  // never used
    }   
};</code>

Templat Fungsi Ahli vs. Bukan Ahli:

Kebimbangan dan cadangan yang dibincangkan memohon kepada templat fungsi ahli dan bukan ahli. Tiada perbezaan ketara dalam pendekatan.

Atas ialah kandungan terperinci Mengapa Anda Harus Mengelak Menggunakan `std::enable_if` dalam Jenis Pulangan Fungsi?. 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