如何使用只有一个参考参数的可变长度参数列表?

时间:2016-06-06 07:26:47

标签: c++

最近我遇到了一个烦人的问题,我想定义这样的函数:

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是一个选项?

2 个答案:

答案 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的版本也可能是可变参数模板。