【问题标题】:Storing function pointers存储函数指针
【发布时间】:2010-02-10 09:44:22
【问题描述】:

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

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

【问题讨论】:

    标签: c++ function-pointers


    【解决方案1】:

    你的代码已经差不多完成了,你只是看起来不正确,应该是简单的

    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);
    

    【讨论】:

    • yesssss 这就是我想要的 .. 正是我想将 get_bipolar 保存在一个变量中 .. 所以我可以在其他地方再次使用该变量,甚至制作一个数组
    • 我在头文件中声明了functocall2,分配在cpp文件中的样子????????????
    • 只需functocall2 = get_bipolar; 就像任何其他任务一样。
    【解决方案2】:

    您已经(几乎)在您的代码中拥有它:

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

    这定义了一个名为functocall 的函数指针,它指向get_bipolar

    【讨论】:

    • 不应该是简单的... = get_bipolar; 没有&amp;
    • 像这样??双 (*functocall)(双) = &get_bipolar; k=操作(???,2); // 那么这里放什么??
    • @roe - 使用 & 是绝对允许的,并且通常是那些“显式优于隐式”阵营的人的首选
    • @Manuel:你确定吗,感觉函数本身就是定义指针​​(指向代码)。
    • @ismail - 也许你应该在#includes 中加上尖括号?
    【解决方案3】:
    typedef double (*func_t)(double); 
    func_t to_be_used = get_bipolar
    

    【讨论】:

      【解决方案4】:
      typedef double (*PtrFunc)(double); 
      
      PtrFunc ptrBipolar = get_bipolar;
      
      
      OR
      
      
      typedef double (Func)(double); 
      
      Func *ptrBipolar = get_bipolar;
      

      无论您使用哪种舒适。

      【讨论】:

      • 虽然在定义函数类型时,我会将它们命名为“Func”而不是“PtrFunc”。
      【解决方案5】:

      看看 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 需要不同的语法)

      【讨论】:

      • 在 OP 的情况下,这将为每次通话增加一些开销,而没有任何额外的好处
      • boost函数有优点也有缺点。在 OP 的用例中,开销可能微不足道,额外的好处是更整洁的代码和更大的可扩展性。在这样的论坛中似乎值得一提,以便读者可以看到可用的内容。
      【解决方案6】:
      double (*foo)(double);
      

      其中foo 是变量名。

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          猜你喜欢
          • 2021-06-03
          • 1970-01-01
          • 1970-01-01
          • 2020-08-21
          • 1970-01-01
          • 2011-06-13
          • 1970-01-01
          • 2016-02-12
          • 2022-10-01
          相关资源
          最近更新 更多