我如何遍历函数向量并在C ++中调用它们的每一个?

问题描述 投票:2回答:1

我试图遍历存储在向量中的函数数组,并且我想通过迭代器指针对象来调用每个函数,但是像这样:

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;
}
c++ c++11 vector stl iterator
1个回答
8
投票

变量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


0
投票

您具有函数pointers的向量。

您可能想要尝试其他语法:

(*iter->func[i])(5);

或带有安全括号:

(*(iter->func[i]))(5);

您需要取消引用指针才能激活该功能。

© www.soinside.com 2019 - 2024. All rights reserved.