以下使用一个简单的函数指针,但如果我想存储该函数指针怎么办?在这种情况下,变量声明会是什么样的?
#include <iostream>
#include <vector>
using namespace std;
double operation(double (*functocall)(double), double wsum);
double get_unipolar(double);
double get_bipolar(double);
int main()
{
double k = operation(get_bipolar, 2); // how to store get_bipolar?
cout << k;
return 0;
}
double operation(double (*functocall)(double), double wsum)
{
double g = (*functocall)(wsum);
return g;
}
double get_unipolar(double wsum)
{
double threshold = 3;
if (wsum > threshold)
return threshold;
else
return threshold;
}
double get_bipolar(double wsum)
{
double threshold = 4;
if (wsum > threshold)
return threshold;
else
return threshold;
}
答案 0 :(得分:8)
你的代码几乎已经完成了,你似乎只是把它称之为不正确,它应该只是
double operation(double (*functocall)(double), double wsum)
{
double g;
g = functocall(wsum);
return g;
}
如果你想拥有一个变量,它的声明方式是相同的
double (*functocall2)(double) = get_bipolar;
或已经宣布
functocall2 = get_bipolar;
为您提供了一个名为functocall2
的变量,它引用了get_bipolar,只需执行
functocall2(mydouble);
或通过
传递给它operation(functocall2, wsum);
答案 1 :(得分:5)
你已经(几乎)在你的代码中拥有它:
double (*functocall)(double) = &get_bipolar;
这定义了一个名为functocall
的函数指针,它指向get_bipolar
。
答案 2 :(得分:2)
typedef double (*func_t)(double);
func_t to_be_used = get_bipolar
答案 3 :(得分:2)
typedef double (*PtrFunc)(double);
PtrFunc ptrBipolar = get_bipolar;
OR
typedef double (Func)(double);
Func *ptrBipolar = get_bipolar;
你使用起来很舒服。
答案 4 :(得分:1)
看一下boost功能,它是一个仅限标题的库,可以整理一些东西(恕我直言): http://www.boost.org/doc/libs/1_42_0/doc/html/function.html
typedef boost::function<double (double)> func_t;
func_t to_be_used = &get_bipolar;
(注意:VC6需要不同的语法)
答案 5 :(得分:0)
double (*foo)(double);
其中foo
是变量名。
答案 6 :(得分:0)
您应该考虑使用typedef:
typedef double (*MyFunc)(double);
MyFunc ptr_func = &get_bipolar;
(*ptr_func)(0.0);
double operation(MyFunc functocall, double wsum)
{
double g;
g = (*functocall)(wsum);
return g;
}
我还可以推荐身份模板技巧:
template<class T>
class Id
{
typedef T type;
};
Id<double(double)>::type * ptr_func = &get_bipolar;
MyFunc func = &get_bipolar;
(*ptr_func)(0.0);
double operation(Id<double(double)>::type * functocall, double wsum)
{
double g;
g = (*functocall)(wsum);
return g;
}