【问题标题】:How To detect empty argument list for variadric function (va_arg, va_end, va_start)如何检测可变参数函数的空参数列表(va_arg、va_end、va_start)
【发布时间】:2012-08-20 02:38:49
【问题描述】:

我有一个封装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;
}

我想要这样的东西

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;
}

【问题讨论】:

    标签: c++ function visual-c++ argument-passing


    【解决方案1】:

    你不能。无法知道通过省略号传递了多少或什么类型的参数,因此您需要一些其他方式(例如 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-13
      • 1970-01-01
      • 2015-05-27
      • 1970-01-01
      相关资源
      最近更新 更多