我试图遍历存储在向量中的函数数组,并且我想通过迭代器指针对象来调用每个函数,但是像这样:
itr->funcs[i](5); // call the ith index function && pass int 5 as param
我猜不是解决方案,那是什么解决方案?
下面是我的代码,请检查代码中的最后一个for循环。
#include <iostream>
#include <string>
#include <vector>
// to be able to take other functions as arguments in a function
#include <functional>
using namespace std;
// receive other functions inside a function
// syntax: return_type function_name(std::function<return_type(parameter_lists)>func_name, parameter_lists)
double doMath(std::function<double(double)> someOtherFunction, double num){
return someOtherFunction(num);
}
double multBy2(double d){
// b'coz x is pointing to multBy2 the word 'someOtherFunction' in the
// above function behaves like an alias for this function 'multBy2'
return d * 2;
}
double multBy3(double d){
return d * 3;
}
int main (){
// dec && init
auto x = multBy2; // x pointing to multBy2 now
std::cout << "2 * 5.1 : " << x(5.1) << "\n";
std::cout << "multBy2 will be called: " << doMath(x, 6.1) << "\n";
std::cout << "multBy2 will be called, again: " << doMath(x, 6.1) << "\n";
// store different functions inside a vector
// you must use the same signature type functions
std::vector<function<double(double)>> funcs(2);
funcs[0] = multBy2; // multBy2 stored at the zeroth index
funcs[1] = multBy3; // multBy3 stored at the first index
// check
// funcs[0](10), pass value by index
std::cout << "2 * 10 = " << funcs[0](10) << "\n";
std::cout << "3 * 10 = " << funcs[1](10) << "\n";
// loop through them
for (auto itr = funcs.begin(); itr != funcs.end(); itr++){
// iterate through the functions
// itr->funcs[1](10); // I KNOW THIS IS WRONG, WHAT SHOULD I WRITE HERE?
}
return 0;
}
变量itr
是一个迭代器,它基本上是一个指针,即它们都point指向对象。在这种情况下,迭代器指向一个函数。您可以通过用itr
取消引用*itr
(非常类似于指针)来使用该函数。然后,您可以像使用一个函数一样使用该对象(因为它是一个):
for (auto itr = funcs.begin(); itr != funcs.end(); ++itr)
(*itr)(10); // like calling func[i](10)
因为它是迭代器,所以您可能还想使用->
运算符,以便可以直接使用指向对象。不幸的是,如果您尝试做看似显而易见的事情:
itr->(10); // error
语言的语法只是不允许这样做(即使编译器也很难弄清楚括号)。幸运的是,该语言确实可以让您明确表达您的意思,即“我只是想将其视为函数,因此可以使用()
进行调用”。有一个名为call operator的函数,可以将其拼写为operator()
。语法是:
for (auto itr = funcs.begin(); itr != funcs.end(); ++itr)
itr->operator()(10);
但是,此语法似乎确实违反了首先使用便捷的->
运算符的目的。
但是,我建议您在此处使用range-for循环(如果可以使用,通常是更好的选择)。在表达代码意图时,语法更加清晰:
for (auto &func : funcs) // for every function in funcs
func(10); // use the function
这里是工作demo。
您具有函数pointers的向量。
您可能想要尝试其他语法:
(*iter->func[i])(5);
或带有安全括号:
(*(iter->func[i]))(5);
您需要取消引用指针才能激活该功能。