最近我遇到了一个烦人的问题,我想定义这样的函数:
std::string my_sprintf(const char* format, ...)
{
va_list args;
va_start(args, format);
...
}
std::string my_sprintf(const std::string& format, ...)
{
va_list args;
va_start(args, format); // error
...
}
但是当使用可变长度参数列表时,参考值似乎不是最后一个参数。
这是否可以让用户使用std :: string作为格式字符串?
也许检测std :: string并将其转换为c_str()的因素或其他因素可行,但我不知道如何处理以下可变长度参数列表。
编辑: 我没有使用可变参数模板,因为我在里面使用了vsprintf。也许避免使用vsprintf并使用std :: stringstream是一个选项?
答案 0 :(得分:6)
行为未定义:请参阅C ++标准18.10 / 3(适用于C ++ 11和C ++ 14)或cppreference.com: Variadic Arguments。
基本上,您只能使用C pip install virtualenv
中可用的类型,但va_start
类型会例外。
答案 1 :(得分:2)
在C ++中,传递“unknown”参数的方法是使用variadic模板:
template <typename ... Ts>
std::string my_sprintf(const std::string& format, Ts&&...args)
{
return my_sprintf(format.c_str(), std::forward<Ts>(args)...);
}
使用const char*
代替sprintf
,使用vsprintf
的版本也可能是可变参数模板。