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

Mary-Kate Olsen
Lepaskan: 2024-10-30 19:08:45
asal
976 orang telah melayarinya

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>
    Salin selepas log masuk

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>
    Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!