Dalam C 20, menangkap butiran konteks panggilan fungsi dimungkinkan dengan std::source_location. Walau bagaimanapun, menggunakannya dengan fungsi templat variadik terbukti mencabar kerana kedudukan parameter lokasi_sumber.
Kesusahan Kedudukan
Selalunya, parameter variadik mendiami hujung senarai parameter. Ini menghalang penggunaan std::source_location disebabkan oleh sebab berikut:
Percubaan Pertama:
<code class="cpp">template <typename... Args> void debug(Args&&... args, const std::source_location& loc = std::source_location::current());</code>
gagal kerana parameter variadic mesti berada di penghujung.
Percubaan Kedua:
<code class="cpp">template <typename... Args> void debug(const std::source_location& loc = std::source_location::current(), Args&&... args);</code>
memperkenalkan kekaburan untuk pemanggil kerana ia menyelit parameter yang tidak dijangka.
Penyelesaian: Menerima Panduan Potongan
Borang awal boleh dihidupkan semula dengan memperkenalkan panduan potongan:
<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>
Ini membenarkan panggilan seperti :
<code class="cpp">int main() { debug(5, 'A', 3.14f, "foo"); }</code>
Kesimpulan:
Melalui penggunaan panduan potongan, pengaturcara C dengan lancar boleh memasukkan std::source_location ke dalam fungsi templat variadic untuk menangkap maklumat konteks panggilan fungsi dengan mudah.
Atas ialah kandungan terperinci Bagaimana untuk Menggunakan `std::source_location` dengan Fungsi Templat Variadik dalam C 20?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!