【问题标题】:How can I pass a list of arguments to another function in c++? [duplicate]如何将参数列表传递给 C++ 中的另一个函数? [复制]
【发布时间】:2013-12-25 16:31:04
【问题描述】:

我对函数参数有疑问。我有一个调用函数 B 的函数 A。我必须写什么而不是 ???归档该函数A将所有参数传递给函数B?

#include <iostream>
#include <stdarg.h>

void functionA(int a, ...);
void functionB(int a, ...);

int main()
{
    functionA(2, 5, 13);

    return 0;
}

void functionA(int a, ...)
{
    functionB(a, ??? );
}

void functionB(int a, ...)
{   
    va_list params;
    va_start(params, a);
    for(int i = 0; i<a; i++)
    {
        std::cout << va_arg(params, int) << std::endl;
    }
    va_end(params);
}

【问题讨论】:

  • 不要使用可变数量的参数。这是一个愚蠢的想法,不安全
  • 为什么要做意大利面?
  • 您可能需要查找可变参数模板。他们至少会让你做的更干净一点(例如,不破坏类型安全)。

标签: c++ function arguments


【解决方案1】:

我认为你不能用... 做到这一点。如果你重写functionB 以采用va_list 就像vprintf 那样,那应该可以。

【讨论】:

    【解决方案2】:

    你必须创建两个函数,一个接受可变数量的参数,一个接受va_list

    void vunctionB(int a, va_list va)
    {
        ...
    }
    
    void functionB(int a, ...)
    {
        va_list va;
        va_start(va, a);
        functionB(a, va);
        va_end(va);
    }
    

    可能还有其他可能的解决方案,例如使用variadic templates in C++11

    【讨论】:

      【解决方案3】:

      您需要设计 两个 版本的函数,一个带有 valists,一个带有可变参数:

      void vfunctionA(int a, va_list ap)
      {
          // real logic
      }
      
      void functionA(int a, ...)
      {
          va_list ap;
          va_start(ap, a);
          vfunctionA(a, ap);
          va_end(ap);
      }
      
      // same for functionB
      

      现在您可以轻松地根据另一个功能实现一个功能:

      double vrandom(int x, va_list ap)
      {
          return vfunctionX(x, ap);
      }
      

      如果您检查标准库或 Posix 库,您会发现大量示例,例如printf/vprintf, execl/execv(但不是fork/vfork!)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-05
        • 2013-11-21
        • 1970-01-01
        • 2020-05-21
        • 1970-01-01
        • 2012-09-25
        • 2020-10-03
        相关资源
        最近更新 更多