在可變參數模板函數中使用std::source_location
利用C 20 功能std::source_location 捕獲可變參數模板中的上下文資訊時函數中,在確定將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>
這會讓呼叫者感到困惑,在傳遞常規參數(例如debug(42);)時會出錯。
解決方案:推演指南
可以透過在第一種形式中加入推演指南來解決這個問題:
<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>
這個推演指南來解決這個問題:
這個推演指南指南根據模板參數進行推斷在函數參數上,允許將source_location 參數放置在末尾。
<code class="cpp">int main() { debug(5, 'A', 3.14f, "foo"); }</code>測驗與示範現場示範:https://godbolt.org /z/n9Wpo9Wrj
以上是如何在可變參數模板函數中使用'std::source_location”?的詳細內容。更多資訊請關注PHP中文網其他相關文章!