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

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

DDD
DDDオリジナル
2024-11-01 02:13:02884ブラウズ

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

可変引数テンプレート関数におけるソース位置の問題の解決

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>

    は、可変個引数パラメーターが必要であるため失敗します。

  • 2 回目の試行:

    <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 中国語 Web サイトの他の関連記事を参照してください。

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