存储函数指针

时间:2010-02-10 09:44:23

标签: c++ function-pointers

以下使用一个简单的函数指针,但如果我想存储该函数指针怎么办?在这种情况下,变量声明会是什么样的?

#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;
}

7 个答案:

答案 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;
}