可変個引数テンプレート関数での 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 サイトの他の関連記事を参照してください。