【问题标题】:C++ callback function which does nothing什么都不做的C++回调函数
【发布时间】:2012-08-21 17:51:48
【问题描述】:

我有这样的代码

typedef void(_stdcall * MyProcessor)(int, int);

void FunctionProcess (MyProcessor process){
    MyProcessor myCallback;
    myCallback = (process != NULL)? process:"<functionThatDoesNothing>";
    ...
}

如果参数中没有任何回调函数,我想为 myCallback 分配一些函数,它什么都不做(或什么都做不了),因为之后,我在循环中调用这个函数(并且由于管道刷新,我想避免循环中的“if”)。我试过no-op lambda 没有成功(不兼容)。

有这样的功能吗?还有其他可能吗?谢谢。

【问题讨论】:

  • 你不能事先定义一个无操作函数并使用它吗?
  • @juanchopanza:我认为那里缺少逗号。但任何赌注都和我一样好。

标签: c++ callback


【解决方案1】:

用你想要的签名写一个空函数。

void __stdcall pass(int a, int b) 
{
}

【讨论】:

    【解决方案2】:
    typedef void(_stdcall * MyProcessor)(int,int);
    
    void _stdcall noop(int,int) {}
    
    void functionProcess (MyProcessor process){
        MyProcessor const myCallback = process?process:noop;
        myCallback(7,4);
    }
    

    【讨论】:

      【解决方案3】:

      你的逻辑太疯狂了!如果if 被正确预测,它将几乎是免费的。如果间接跳跃被错误地预测,那将是可怕的。 if 比间接跳转更容易预测(只有两种可能性,可以推测执行,大多数 CPU 上都有更多预测槽)。因此,几乎没有可以想象的情况下这是有意义的。

      【讨论】:

      • 抱歉,货物崇拜编程真的让我很生气。
      • @David - 直言不讳。为什么不把铁锹称为空间?!
      • 请注意,逻辑不能是疯狂的。逻辑可能有缺陷或错误。人们可能会发疯。
      • @bitmask:实际上,“不合逻辑”是“疯狂”的同义词。所以它可以理解为“你所呈现的逻辑实际上是不合逻辑的”。但我明白你的意思。
      • @Qnan:OP 说“由于管道冲洗,我想避免循环中的'if'”。这是货物崇拜编程:我听说 X 很糟糕,但从来没有真正理解为什么,所以我将用同样原因更糟糕的东西替换它
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-11
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      • 1970-01-01
      相关资源
      最近更新 更多