在 C 20 中,使用 std::source_location 可以捕獲函數呼叫上下文詳細資訊。然而,由於 source_location 參數的定位,將其與可變參數模板函數一起使用已被證明具有挑戰性。
位置困境
可變參數總是位於末尾參數列表。由於以下原因,這阻礙了std::source_location 的使用:
第一次嘗試:
<code class="cpp">template <typename... Args> void debug(Args&&... args, const std::source_location& loc = std::source_location::current());</code>
失敗,因為可變參數必須
第二次嘗試:
<code class="cpp">template <typename... Args> void debug(const std::source_location& loc = std::source_location::current(), Args&&... args);</code>
插入意外參數時會給呼叫者帶來歧義。
解決方案:擁抱推演指南
初始形式可以透過引入推演指南來煥發活力:
<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>
<code class="cpp">int main() { debug(5, 'A', 3.14f, "foo"); }</code>
這允許像這樣的呼叫:結論:透過使用推導指南,C 程式設計師可以將std::source_location 無縫地合併到可在變參數模板函數中,以捕獲函數調用上下文資訊毫不費力。
以上是如何在 C 20 中將 `std::source_location` 與可變參數模板函數一起使用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!