c – 使用可变参数模板参数的boost :: format

前端之家收集整理的这篇文章主要介绍了c – 使用可变参数模板参数的boost :: format前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
假设我使用完美转发具有类似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));会做.

猜你在找的C&C++相关文章