代码之家  ›  专栏  ›  技术社区  ›  Ismail Marmoush

存储函数指针

  •  8
  • Ismail Marmoush  · 技术社区  · 14 年前

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

    #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 回复  |  直到 14 年前
        1
  •  7
  •   falstro    14 年前

    您的代码几乎已经完成了,您似乎只是不正确地调用它,它应该只是

    double operation(double (*functocall)(double), double wsum)
    {
        double g;
        g = functocall(wsum);
        return g;
    }
    

    如果您想要一个变量,它的声明方式是相同的

    double (*functocall2)(double) = get_bipolar;
    

    或者当已经宣布

    functocall2 = get_bipolar;
    

    给你一个变量 functocall2 它指的是获得双极性,通过简单的

    functocall2(mydouble);
    

    或者通过

    operation(functocall2, wsum);
    
        2
  •  5
  •   Péter Török    14 年前

    您的代码中已经(几乎)包含了它:

    double (*functocall)(double) = &get_bipolar;
    

    这将定义一个名为 functocall 哪些指向 get_bipolar .

        3
  •  2
  •   pierrotlefou    14 年前
    typedef double (*func_t)(double); 
    func_t to_be_used = get_bipolar
    
        4
  •  2
  •   Ashish    14 年前
    typedef double (*PtrFunc)(double); 
    
    PtrFunc ptrBipolar = get_bipolar;
    
    
    OR
    
    
    typedef double (Func)(double); 
    
    Func *ptrBipolar = get_bipolar;
    

    无论何时你都可以舒适地使用。

        5
  •  1
  •   Patrick    14 年前

    看看Boost函数,它是一个只包含头部的库,可以稍微整理一下(imho): 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需要不同的语法)

        6
  •  0
  •   Vebjorn Ljosa    14 年前
    double (*foo)(double);
    

    在哪里? foo 是变量名。

        7
  •  0
  •   Manuel    14 年前

    您应该考虑使用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;
    }