C++ 将参数传递给另一个变量函数
有没有任何方法可以让这段代码按照预期进行编译和工作,而不必求助于C++ 将参数传递给另一个变量函数,c++,parameter-passing,c++17,ellipsis,variadic,C++,Parameter Passing,C++17,Ellipsis,Variadic,有没有任何方法可以让这段代码按照预期进行编译和工作,而不必求助于va_list之类的东西 #include <iostream> void fct(void) { std::cout << std::endl; } void fct(int index, int indexes...) { std::cout << index << ' '; fct(indexes); //or fct(indexes...); ? }
va_list
之类的东西
#include <iostream>
void fct(void)
{
std::cout << std::endl;
}
void fct(int index, int indexes...)
{
std::cout << index << ' ';
fct(indexes); //or fct(indexes...); ?
}
int main(void)
{
fct(1, 2, 3, 4, 5, 6, 7);
return 0;
}
#包括
无效fct(无效)
{
我怀疑你误解了签名的意思
void fct (int index, int indexes...)
我猜想你认为fct()
期望一个int
单值(index
)和一个int
的可变列表(indexex…
)以及C++11风格的参数包扩展
否:
所以两个int
单个值和一个C风格的可选参数,只能通过va_list
使用
如果您不相信,请尝试仅使用整数参数调用fct()
fct(1);
对于变量版本的fct()
,您应该获得类型为“error:no matching function for call to'fct'”的错误,类型为“note:candidate function not available:需要至少2个参数,但提供了1个”
如果希望接收可变参数列表并递归地将参数传递给同一个函数,可以使用模板可变方式
以身作则
template <typename ... Ts>
void fct(int index, Ts ... indexes)
{
std::cout << index << ' ';
fct(indexes...);
}
模板
无效fct(整数索引、Ts…索引)
{
如果你真的不喜欢模板的想法,我想你可以像这样作弊:
#include <iostream>
#include <vector>
void fct(std::vector<int>&& _indices)
{
for (auto&& i : _indices)
{
std::cout << i << ' ';
}
std::cout << std::endl;
}
int main(void)
{
fct({1, 2, 3, 4, 5, 6, 7}); // Note the curly braces
return 0;
}
#包括
#包括
无效fct(标准:向量和指数)
{
对于(自动和i:_索引)
{
std::你有没有考虑过让fct
成为一个可变模板函数?这将如何解决我的问题?这不会毫无意义地使事情复杂化吗?到目前为止,我试图实现的似乎非常简单。事实是,我不能在这里使用可变模板,因为我已经这样做了。上面的代码非常简单,可以触及问题的核心m、 但是我正在处理的真正代码有一个std::size\u t可变模板。我想在没有模板的情况下解决这个问题。我不确定我是否遵循了。为什么你不能将其作为模板?@cantordust我在这里提出了我的问题:也许会加入一个void fct(){std::cout感谢您的回复。换句话说,没有模板和va_list
:\@Pippin-不,据我所知。或者更好:方法(从C++11开始)是可变模板吗?对于你来说,我不明白可变模板的方式有什么不对。@max66我在这里提出了我的问题:@Pippin-正如你在我的新问题答案中所看到的,可变模板的使用非常简单。
#include <iostream>
#include <vector>
void fct(std::vector<int>&& _indices)
{
for (auto&& i : _indices)
{
std::cout << i << ' ';
}
std::cout << std::endl;
}
int main(void)
{
fct({1, 2, 3, 4, 5, 6, 7}); // Note the curly braces
return 0;
}