概要:
std::source_location、 C 20 で導入されたこの機能は、関数の実行コンテキストに関する貴重な洞察を提供します。ただし、可変個引数テンプレート関数との統合により課題が生じる可能性があります。この記事では、可変長引数テンプレート関数で std::source_location を使用する際の複雑さを解明し、実用的な解決策を示します。
問題:
可変長引数テンプレートに std::source_location を組み込もうとしています関数はパラメータ リスト内に配置されるため、障害に直面します。これをリストの先頭に置くと、最後のパラメーターである必要がある可変引数パラメーターの要件と競合します。一方、可変引数パラメーターの間にこれを挿入すると、呼び出し規約が中断される可能性があります。
解決策 1: 演繹ガイド レスキュー
最初の解決策では、演繹ガイドを使用して、提供されたパラメータに基づいて適切な関数テンプレートを推定します。 std::source_location をオプションのパラメーターとして含む推測ガイドを追加することで、配置の問題を解決できます。
<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>
解決策 2: パラメーター外の配置
あるいは、配置をバイパスして、可変個引数テンプレート関数の外側で std::source_location パラメータを宣言することもできます。
<code class="cpp">auto debug_caller(const std::source_location& loc = std::source_location::current()) { return [=](auto&&... args) { // Utilize location information within the lambda expression }; }</code>
このアプローチは柔軟性を高め、呼び出し規約の中断を防ぎます。
デモの例:
<code class="cpp">int main() { debug(5, 'A', 3.14f, "foo"); }</code>
ここではたとえば、位置情報が取得され、デバッグ内で利用できます。 function.
結論:
可変個引数テンプレート関数で std::source_location を使用するには慎重な検討が必要ですが、この記事で紹介するソリューションは、その機能を活用する実用的な方法を提供します。推論ガイドまたはパラメーター配置の変更を通じて、開発者は実行コンテキスト情報を効果的に取得し、追加の洞察でコードを強化できます。
以上がC 20 で可変引数テンプレートで `std::source_location` を使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。