我可以知道我的函数有多少参数?

时间:2018-06-08 07:58:21

标签: c++ function c++11

给定c ++中的函数,有没有办法获得我的函数需要的参数数量? (例如c语言中的argc中的main)。

例如:

double MyFunction(int x , int y) {   
    int NumOfParam= //.... =2;  
}    

为什么这对我有用?
例如,我想编写一个函数,将函数的所有参数插入vector,我想用for loop来迭代参数。

例如:

void MyFunction(int x,int y , int z){  
    std::vector<int> params;  
    for(int i=0; i< ?? ; i++) {  
        params.push_back("ArrayOfMyArguments[i]");
    }
}

2 个答案:

答案 0 :(得分:9)

您正在寻找的是与variadic templates (a/k/a parameter packs)结合使用的功能模板:

template<class ... Args>
void f(Args ... args)
{
    std::cout << sizeof...(args) << "\n";
}

int main()
{
    f(0, 1, 2); // prints 3
    f(0, 1, 2, 3, 4); // prints 5
}

这通常不是默认情况下使用的。考虑使用范围:

template<class Iterator>
void f(Iterator begin, Iterator end)
{
    std::cout << std::distance(begin, end) << "\n";
}

更为惯用。

答案 1 :(得分:7)

在我看来,你来自JavaScript背景,其中所有函数都有arguments数组。 C ++不是JavaScript,也不可能。

如果您想拥有动态数量的参数,那么解决方案是:

  • parameter packs
  • std::initializer_list
  • 如果您有来自其他容器的序列,则使用迭代器对
  • C风格的variadic functions(您需要一个特殊的参数来告诉您可变参数的数量,或者“参数结束”标记)
  • argcargv之类的解决方案

如果您只想填充一个向量,那么我建议您直接填充它,或者通过循环在需要的时间和地点填充,或者通过构造函数获取std::initializer_list(如下所述)我的一条评论)。

如果你真的需要向函数传递可变数量的参数,那么我建议使用参数包。