如何检测variadric函数的空参数列表(va_arg,va_end,va_start)

Gol*_*k84 3 c++ function argument-passing visual-c++

我有一个封装CString :: FormatV函数的函数,我需要能够检测是否有一个空参数列表传递给该函数.最好的方法是什么?

我目前的代码是这样的

CString ADString::Format(CString csFormat, ...)
{
    //Code comes from CString::Format()
    CString csReturn;
    va_list argList;
    va_start(argList, csFormat);
    csReturn.FormatV(csFormat, argList);
    va_end( argList );
    return csReturn;
}
Run Code Online (Sandbox Code Playgroud)

我想要那样的东西

CString ADString::Format(CString csFormat, ...)
{
    //Code comes from CString::Format()
    CString csReturn;
    va_list argList;
    va_start(argList, csFormat);
    //If it's empty, don't send to FormatV
    if(!IsArgListEmpty(argList))
        csReturn.FormatV(csFormat, argList);

    va_end( argList );

    return csReturn;
}
Run Code Online (Sandbox Code Playgroud)

Mik*_*our 8

你不能.没有办法告诉通过省略号传递了多少或哪种类型的参数,因此您需要一些其他方法(例如printf格式字符串)来传递该信息.

在C++ 11中,您可以使用可变参数模板执行非常类似的操作:

template <typename... Args>
CString ADString::Format(CString csFormat, Args... argList)
{
    CString csReturn;

    //If it's empty, don't send to FormatV
    if(sizeof... argList != 0)
        csReturn.FormatV(csFormat, argList...);    

    return csReturn;
}
Run Code Online (Sandbox Code Playgroud)