作为数组元素调用函数

function call as array element

本文关键字:函数 调用 数组元素      更新时间:2023-10-16

我在理解和实现以下问题上有一些困难:

将函数调用存储在数组中,即拥有一个双精度值数组和一个返回双精度值的函数....我想当调用例如数组的元素,让我们说myArray[0],它应该调用函数myArray,返回一个双精度。

double myFunction(){return mydouble}
double myArray[3];
...
cout<<myArray[2]<<endl; <- should call myFunction and return "mydouble"

c++参考std::function, C参考函数指针

函数指针也可以在c++中使用,但不如std::function灵活。

c++的解决方案:

struct MyStruct
{
    double myStructFunction() { return 2.0; }
};
std::function<double()> myArray[3];
MyStruct myStructure;
myArray[0] = []() { return 1.0; };
myArray[1] = std::bind(&MyStruct::myStructFunction, myStructure);
myArray[2] = myFunction;
for (int i = 0; i < 3; i++)
    std::cout << "Calling `myArray[" << i << "]` : " << myArray[i]() << 'n';

对于myArray[0]的赋值查找lambda函数,对于myArray[1]的赋值查找std::bind

那么你应该有一个函数指针数组来实现这一点:

typedef double(*MyArray)();

MyArray MA[3];

您可以将签名为double function_name()的函数存储到数组中,例如:

MA[0] = MyFunction;

cout<< MA[0]()<<endl;

在C语言中可以这样做:

#include <stdio.h>
/* Functions */
static double fn_0(void){return 0.;}
static double fn_1(void){return 1.;}
static double fn_2(void){return 2.;}
int main(void)
{
    /* Declaration */
    double (*pfn[])(void) = {fn_0, fn_1, fn_2};
    int i;
    for (i = 0; i < 3; i++) {
        printf("%fn", pfn[i]()); /* Usage */
    }
    return 0;
}

在C和c++中解决方案是不同的,在c++ 11及其之前版本

在所有这些中,您可以拥有指向的指针的简单数组功能:

double (*array[3])() = { &f1, &f2, &f3 };

调用函数:

std::cout << (*array[i])() << std::endl;

这是非常有限的,因为它意味着问题不能依赖于任何其他数据。由于这个原因,它通常在C语言中创建一个struct:

struct F
{
    double (*pf)( void* );
    void*    data;
};
F array[3] = { { &f1, NULL }, { &f2, someData }, { &f3, NULL } };
std::cout << (*array[i].pf)( &data ) << std::endl;

(但是,有很多情况,特别是在数字中计算,这是多余的。它主要被回调。)

在c++中,您还可以选择定义抽象基类,带有一个虚函数(将在每个类中重写该虚函数)派生类),并保存指向各种实例的指针派生类:

class F
{
public:
    virtual ~F() {}
    virtual double operator()() const = 0;
};
F const* array[3] = { &obj1, &obj2, &obj3 };
std::cout<< (*array[i])() << std::endl;

最后,在c++ 11中有一个标准对象std::function它概括了这一切。)你得查一下然而,自己。和大多数人一样,我还没有办法一个完全支持c++ 11的编译器,所以我无法)

    double myFunction()
{
    double mydouble = 1;
  return mydouble;
}
int main()
{
  double myArray[3] = {0,0,0};
  for(int i=0;i<3;i++)
  {
    myArray[i] = myFunction();
    cout << myArray[i];
  }
}

像这样简单的东西怎么样?:

#include <iostream>
#include <map>
struct O
{
  std::map<size_t,double(*)()> m;
  double operator[](size_t index)
  {
    return m[index]();
  }
};
double mydouble = 1.25;
double myFunction()
{
  return mydouble;
}
int main()
{
  O myArray;
  myArray.m[2] = &myFunction;
  std::cout << myArray[2] << std::endl;
  return 0;
}
输出(ideone):

1.25