Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Adakah Argumen Templat `std::function` Mempengaruhi Jenisnya Semasa Pembinaan Objek?

Adakah Argumen Templat `std::function` Mempengaruhi Jenisnya Semasa Pembinaan Objek?

DDD
DDDasal
2024-11-05 22:35:02566semak imbas

Does the Template Argument of `std::function` Influence its Type During Object Construction?

Adakah Argumen Templat std::function Termasuk dalam Jenisnya?

Pengenalan Masalah

Apabila menggunakan templat std::function, kekaburan boleh timbul disebabkan oleh banyak beban yang munasabah. Secara khusus, pertimbangkan coretan kod berikut:

<code class="cpp">#include <functional>

using namespace std;

int a(const function<int()>& f) { return f(); }
int a(const function<int(int)>& f) { return f(0); }
int x() { return 22; }
int y(int) { return 44; }

int main() {
    a(x); // Call is ambiguous.
    a(y); // Call is ambiguous.
}</code>

Kekaburan berpunca daripada fakta bahawa kedua-dua fungsi dan fungsi boleh dibina daripada penuding fungsi generik. Ini memperkenalkan berbilang padanan yang berpotensi untuk lebihan fungsi a.

Resolusi Kekaburan

Tandatangan hujah templat untuk std::function dianggap sebagai sebahagian daripada jenisnya semasa pengisytiharan dan takrifan. Walau bagaimanapun, ini tidak berlaku semasa pembinaan objek.

std::function, seperti banyak objek berfungsi dalam C , menggunakan teknik yang dipanggil pemadaman jenis. Ini membolehkannya menerima objek atau fungsi sewenang-wenangnya, selagi ia memenuhi tandatangan yang diharapkan apabila dipanggil. Kelemahannya ialah ralat yang berkaitan dengan tandatangan yang tidak sepadan berlaku jauh dalam pelaksanaan, bukannya pada peringkat pembina.

Mengelakkan Kekaburan

Tiga pilihan utama wujud untuk mengelakkan kekaburan ini:

  • Penghantaran Jenis Eksplisit: Hantar penunjuk fungsi secara manual ke tandatangan khusus yang diperlukan oleh beban berlebihan yang dimaksudkan.
  • Pembungkusan Objek Fungsi: Cipta objek fungsi daripada jenis yang sesuai dan lulus itu sebaliknya.
  • Template Metaprogramming (TMP): Gunakan TMP untuk menjana fungsi dengan tandatangan yang dikehendaki, mengelakkan hantaran eksplisit.

Kesimpulan

Walaupun hujah templat bagi std::function menentukan jenisnya semasa pengisytiharan dan takrifan, ia tidak memainkan peranan dalam pembinaan objek. Ini boleh membawa kepada kekaburan apabila pembina menerima hujah sewenang-wenangnya. Untuk menyelesaikan masalah ini, pengaturcara boleh menggunakan penghantaran jenis eksplisit, pembalut objek fungsi atau TMP.

Atas ialah kandungan terperinci Adakah Argumen Templat `std::function` Mempengaruhi Jenisnya Semasa Pembinaan Objek?. 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