【发布时间】:2014-11-09 15:58:55
【问题描述】:
假设我有一个使用完美转发的printf-like 函数(用于记录):
template<typename... Arguments>
void awesome_printf(std::string const& fmt, Arguments&&... args)
{
boost::format f(fmt);
f % /* How to specify `args` here? */;
BlackBoxLogFunction(boost::str(f).c_str());
}
(我没有编译这个,但我的真正功能遵循这个指南)
如何将可变参数“展开”到 boost::format 变量 f?
【问题讨论】:
-
我不知道它是否会起作用,但是您是否尝试过,例如
args...? -
@JoachimPileborg 我确实尝试过:coliru.stacked-crooked.com/a/9e651d5f7532cc67,不幸的是它不起作用(除非我做错了)。
-
这就是扩展可变参数模板参数的方式。不幸的是,Boost 格式使用重载的
%运算符来分隔参数,这不适用于扩展的参数包。 -
@JoachimPileborg 嗯,它是在模板参数包和完美转发存在之前设计的,这占了设计的很大一部分(以及它的弱点)。
-
我想可以使用 C++1z 附带的折叠运算符来完成。 en.cppreference.com/w/cpp/language/fold 。相关:stackoverflow.com/questions/27582862/…
标签: c++ c++11 boost variadic-templates boost-format