我有点不喜欢使用固定大小的缓冲区和vnsprintf常见的嫌疑人。
像这样的东西可以让boost :: format使用变量参数列表吗?
可悲的是,我无法使用C ++ 11中的任何内容。
void formatIt(const char* msg, ...) {
va_list args;
va_start(args, msg);
boost::format f(msg);
for loop somehow {
f % va_arg(args, const char *); //does this work?
}
va_end(args);
}
答案 0 :(得分:7)
我用这个:
inline static std::string FormatStringRecurse(boost::format& message)
{
return message.str();
}
template <typename TValue, typename... TArgs>
std::string FormatStringRecurse(boost::format& message, TValue&& arg, TArgs&&... args)
{
message % std::forward<TValue>(arg);
return FormatStringRecurse(message, std::forward<TArgs>(args)...);
}
template <typename... TArgs>
std::string FormatString(const char* fmt, TArgs&&... args)
{
using namespace boost::io;
boost::format message(fmt);
return FormatStringRecurse(message, std::forward<TArgs>(args)...);
}
答案 1 :(得分:2)
我以前用过这个:
inline static std::string FormatString()
{
return std::string();
}
inline static std::string FormatString(const char* szMessage)
{
return szMessage;
}
template<typename Type1>
static std::string FormatString(const char* formatString, const Type1& arg1)
{
using namespace boost::io;
boost::format formatter(formatString);
formatter % arg1;
return boost::str( formatter );
}
template<typename Type1, typename Type2>
static std::string FormatString(const char* formatString, const Type1& arg1, const Type2& arg2)
{
using namespace boost::io;
boost::format formatter(formatString);
formatter % arg1 % arg2;
return boost::str( formatter );
}
template<typename Type1, typename Type2, typename Type3>
static std::string FormatString(const char* formatString, const Type1& arg1, const Type2& arg2, const Type3& arg3)
{
using namespace boost::io;
boost::format formatter(formatString);
formatter % arg1 % arg2 % arg3;
return boost::str( formatter );
}
/// etc up to 10 args
我想它并没有像你要求的那样使用varargs,但是你经常需要超过10个左右的参数吗?可能会有一些宏观魔法可以让你想要的东西发生,但是错误......那就是魔法,所以你可能会因为写完所有版本而变得更好。