Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menggunakan `std::source_location` dalam Fungsi Templat Variadic?

Bagaimana untuk Menggunakan `std::source_location` dalam Fungsi Templat Variadic?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-30 19:08:451063semak imbas

How to Use `std::source_location` in Variadic Template Functions?

Menggunakan std::source_location dalam Fungsi Templat Variadik

Apabila memanfaatkan ciri C 20 std::source_location untuk menangkap maklumat konteks dalam templat variadic fungsi, cabaran timbul dalam menentukan di mana hendak meletakkan parameter lokasi_sumber.

Percubaan Gagal

Percubaan yang salah termasuk:

  • Parameter Variadik di Hujung:

    <code class="cpp">template<typename... Args>
    void debug(Args&&... args, const std::source_location& loc = std::source_location::current());</code>

Ini gagal kerana parameter variadic mesti berada di hujung.

  • Sisipan Parameter:

    <code class="cpp">template<typename... Args>
    void debug(const std::source_location& loc = std::source_location::current(),
    Args&&... args);</code>

Ini mengelirukan pemanggil, yang akan ralat apabila menghantar argumen biasa (mis., nyahpepijat(42);).

Penyelesaian: Panduan Potongan

Isu ini boleh diselesaikan dengan menambahkan panduan potongan pada borang pertama:

<code class="cpp">template<typename... Ts>
struct debug
{
    debug(Ts&&... ts, const std::source_location& loc = std::source_location::current());
};

template<typename... Ts>
debug(Ts&&...) -> debug<Ts...>;</code>

Panduan potongan ini menyimpulkan parameter templat berdasarkan pada argumen fungsi, membenarkan parameter lokasi_sumber diletakkan pada penghujungnya.

Ujian dan Demonstrasi

<code class="cpp">int main()
{
    debug(5, 'A', 3.14f, "foo");
}</code>

Demo Langsung: https://godbolt.org /z/n9Wpo9Wrj

Atas ialah kandungan terperinci Bagaimana untuk Menggunakan `std::source_location` dalam Fungsi Templat Variadic?. 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