C 11: Fungsi Aliasing
Dalam C , kata kunci menggunakan boleh digunakan untuk mencipta alias untuk kelas. Walau bagaimanapun, fungsi yang sama tidak tersedia secara langsung untuk fungsi. Artikel ini meneroka persoalan sama ada penyalian fungsi boleh dilakukan dan menyediakan penyelesaian menggunakan pemajuan yang sempurna.
Objektif:
Untuk menentukan sama ada boleh mencipta alias untuk fungsi dalam C dan, jika ya, untuk mencari kaedah paling bersih untuk mencapai ini.
Pernyataan Masalah:
Pertimbangkan kod berikut:
<code class="cpp">namespace bar { void f(); }</code>
Kami ingin untuk mencipta alias bernama g untuk bar fungsi::f. Walau bagaimanapun, percubaan berikut menghasilkan ralat:
<code class="cpp">using g = bar::f; // error: ‘f’ in namespace ‘bar’ does not name a type</code>
Penyelesaian:
Untuk mencipta alias fungsi, kami boleh menggunakan gabungan templat dan pemajuan yang sempurna. Berikut ialah contoh cara ini boleh dicapai:
<code class="cpp">template <typename... Args> auto g(Args&&... args) -> decltype(f(std::forward<Args>(args)...)) { return f(std::forward<Args>(args)...); }</code>
Penyelesaian ini berfungsi dengan mencipta fungsi templat generik yang mengambil sebarang bilangan hujah. Ia kemudian memajukan hujah-hujah ini ke fungsi asal f menggunakan pemajuan sempurna. Ini memastikan bahawa fungsi yang dipanggil menerima argumen dalam bentuk asalnya, tidak kira apa-apa jenis penukaran atau dereference penuding yang mungkin telah digunakan pada alias.
Nota:
Penyelesaian ini juga berfungsi untuk fungsi terlampau beban dan templat fungsi, memastikan fungsi yang betul dipanggil berdasarkan hujah yang disediakan.
Atas ialah kandungan terperinci Adakah Fungsi Aliasing Mungkin dalam C 11?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!