[英]looping over all arguments of a function in C++
我想对函数的一堆参数进行相同的处理。 有没有办法循环所有参数? 我按照以下代码中的方式进行操作,但是想看看是否有一种紧凑的方法来执行此操作。
void methodA(int a1, int a2, int b1, double b2){
//.. some code
methodB(a1, f(a1));
methodB(a2, f(a2));
methodB(b1, f(b1));
methodB(b2, f(b2));
// more code follows ...
}
int f(int a){
// some function.
return a*10;
}
double f(double b){
return b/2.0;
}
您可以使用可变参数模板:
template <typename T, typename ...Args>
void methodAHelper(T && t, Args &&... args)
{
methodB(t, f(t));
methodAHelper(std::forward<Args>(args)...);
}
void methodAHelper() { }
template <typename ...Args>
void methodA(Args &&... args)
{
// some code
methodAHelper(std::forward<Args>(args)...);
// some other code
}
如果你知道你的methodB
调用不知道rvalue引用,你可以摆脱&&
和转发,这将使代码更简单(你有const Args &...
),例如:
methodAHelper(const T & t, const Args &... args)
{
methodB(t, f(t));
methodAHelper(args...);
}
你也可以考虑改变methodB
:由于第二个参数是第一个参数的函数,你可能只能够通过第一个参数,进行调用f()
内 methodB()
这减少了耦合和相互依赖; 例如, f
的整个声明只需要知道methodB
的实现。 但这取决于你的实际情况。
可替换地,如果存在的只有一个过载methodB
其第一个参数是类型的T
,那么你可以只通过一个std::vector<T>
到methodA
和遍历它:
void methodA(const std::vector<T> & v)
{
// some code
for (auto it = v.cbegin(), end = v.cend(); it != end; ++it)
methodB(*it, f(*it));
// some more code
}
int main() { methodA(std::vector<int>{1,2,3,4}); }
是的,您正在寻找的概念称为可变函数 。
取决于您要做的事情。 最简单的事情可能是重新访问你的函数,看看它是否可以将数组或std :: vector作为参数。 采用可变路线可能要简单得多
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.