我在理解和实施以下问题时遇到一些困难:
在一个数组中存储一个函数调用,即有一个双精度数组和一个返回double的函数....我想在调用例如数组的一个元素,比方说myArray [0],它应该调用函数myArray,它返回一个double。
double myFunction(){return mydouble}
double myArray[3];
...
cout<<myArray[2]<<endl; <- should call myFunction and return "mydouble"
答案 0 :(得分:5)
对于C ++查找std::function
,对于C,请阅读有关function pointers的更多信息。
函数指针也可以在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 functions,myArray[1]
分配查找std::bind
。
答案 1 :(得分:3)
然后你应该有一些函数指针来实现这个目的:
typedef double(*MyArray)();
MyArray MA[3];
您可以将带有签名double function_name()
的函数存储到数组中,例如:
MA[0] = MyFunction;
cout<< MA[0]()<<endl;
答案 2 :(得分:1)
在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("%f\n", pfn[i]()); /* Usage */
}
return 0;
}
答案 3 :(得分:1)
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];
}
}
答案 4 :(得分:1)
解决方案在C和C ++中有所不同,也有所不同 C ++ 11和前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,具有虚函数(将在每个函数中重写) 派生类),并保存指向各种实例的指针 派生类:
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的编译器,所以一直无法做到
练习这个。)
答案 5 :(得分:1)
这么简单的事情怎么样?:
#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