ホームページ >バックエンド開発 >C++ >可変引数テンプレート関数で `std::source_location` を使用する方法は?

可変引数テンプレート関数で `std::source_location` を使用する方法は?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-30 19:08:451065ブラウズ

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

可変個引数テンプレート関数での std::source_location の使用

C 20 機能 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>

これは呼び出し側を混乱させ、通常の引数 (例: 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。