在可变参数模板函数中使用 std::source_location
利用 C 20 功能 std::source_location 捕获可变参数模板中的上下文信息时函数中,在确定将 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中文网其他相关文章!