作为数组元素调用函数
function call as array element
我在理解和实现以下问题上有一些困难:
将函数调用存储在数组中,即拥有一个双精度值数组和一个返回双精度值的函数....我想当调用例如数组的元素,让我们说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
灵活。
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
- 函数调用中参数的顺序重要吗
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 变量没有改变?通过向量的函数调用
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 模板函数调用
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 析构函数调用
- 成员函数调用和C++对象模型
- 使用共享指针的函数调用,其对象应为 const
- C++:编译时检查匹配的函数调用对?
- 函数调用C++中的参数太少
- 来自 DLL 的函数调用 [表观调用的括号前面的表达式必须具有(指向-)函数类型]
- 返回指向对象的指针的函数调用是否为 prvalue?
- C++ 如何重载 [] 运算符并进行函数调用
- 代码的效率. 转到和函数调用
- 是同一作用域的函数部分中的函数调用
- 如何封装一个函数,以便它只能由同一类中的一个其他函数调用?
- 类型擦除的std::function与虚拟函数调用的开销