Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah `std::function` Membawa kepada Kekaburan dalam Tandatangan Argumen Templat?

Mengapakah `std::function` Membawa kepada Kekaburan dalam Tandatangan Argumen Templat?

Susan Sarandon
Susan Sarandonasal
2024-11-06 00:42:02965semak imbas

Why Does `std::function` Lead to Ambiguity in Template Argument Signatures?

Kekaburan dalam std::function Tandatangan Argumen Templat

Kekaburan timbul apabila kedua-duanya berfungsi dan fungsi boleh dibina daripada fungsi yang sama. Oleh kerana fungsi std::bergantung pada pemadaman jenis, ia boleh menerima fungsi sewenang-wenangnya, walaupun tandatangannya tidak sepadan dengan tandatangan hujah templat.

Untuk menggambarkan ini, pertimbangkan kelas:

<code class="cpp">template<class Signature>
class myfunc{
public:
    template<class Func>
    myfunc(Func a_func){
        // ...
    }
};</code>

Apabila pengkompil cuba mencari fungsi yang berdaya maju untuk set lebihan, ia mencari kemungkinan penukaran. Dalam kes ini, kedua-dua pembina myfunc menerima apa sahaja, membenarkan penukaran daripada int(*)() kepada myfunc dan daripada int(*)() kepada myfunc untuk berjaya.

Oleh itu, apabila memanggil a(x) atau a(y), pengkompil menemui dua fungsi yang berdaya maju, mengakibatkan kekaburan.

Resolusi

Tandatangan hujah templat bagi fungsi std:: ialah sebahagian daripada jenisnya apabila mengisytiharkan dan mentakrifkan fungsi. Walau bagaimanapun, semasa pembinaan objek, tandatangan diabaikan.

Untuk mengelakkan kekaburan, seseorang boleh:

  • Melemparkan hujah secara eksplisit ke tandatangan yang diingini (cth., (function)(x)).
  • Buat objek fungsi dari jenis yang sesuai dan lulus itu.
  • Gunakan metaprogramming templat (TMP) untuk mengekstrak tandatangan dan hantar secara automatik.

Atas ialah kandungan terperinci Mengapakah `std::function` Membawa kepada Kekaburan dalam Tandatangan Argumen Templat?. 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