0

给定 c++ 中的一个函数,有没有办法获得我的函数所需的参数数量?(就像argcmainc语言中一样)。

例如:

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

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

例如:

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

2 回答 2

9

您正在寻找的是与可变参数模板(a/k/a 参数包)结合使用的函数模板:

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

这是更惯用的。

于 2018-06-08T08:09:43.257 回答
7

在我看来,您来自 JavaScript 背景,所有函数都有一个arguments数组。C++ 不是 JavaScript,这是不可能的。

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

  • 参数包
  • std::initializer_list
  • 如果您有来自另一个容器的序列,则使用迭代器对
  • C 风格的可变参数函数(你需要一个特殊的参数来告诉你可变参数的数量,或者一个“参数结束”标记)
  • 或类似的解决argc方案argv

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

如果您确实需要将可变数量的参数传递给函数,那么我建议使用参数包。

于 2018-06-08T08:11:43.163 回答