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