假设我使用完美转发具有类似printf的功能(用于记录):
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()); }
(我没有编译这个,但我的实际功能遵循这个指导原则)
如何将variadic参数“展开”到boost :: format变量f?
解决方法
与可变参数模板一样,您可以使用递归:
std::string awesome_printf_helper(boost::format& f){ return boost::str(f); } template<class T,class... Args> std::string awesome_printf_helper(boost::format& f,T&& t,Args&&... args){ return awesome_printf_helper(f % std::forward<T>(t),std::forward<Args>(args)...); } template<typename... Arguments> void awesome_printf(std::string const& fmt,Arguments&&... args) { boost::format f(fmt); auto result = awesome_printf_helper(f,std::forward<Arguments>(args)...); // call BlackBoxLogFunction with result as appropriate,e.g. std::cout << result; }
Demo.
在C 17中,简单地说(f%…%std :: forward< Arguments>(args));会做.