首頁 >後端開發 >C++ >如何在可變參數模板函數中使用'std::source_location”?

如何在可變參數模板函數中使用'std::source_location”?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-30 19:08:451073瀏覽

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

在可變參數模板函數中使用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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn