具有不同参数的 C++ std::function 变量

标签 c++ c++11

在我的回调系统中,我想存储 std::function (或其他)有不同的论点。

例子:

  • 我想调用void()
  • 我想调用void(int, int)

  • 我希望 1) 和 2) 存储在同一个变量中,并选择在实际调用中调用什么
    FunctionPointer f0;
    FunctionPointer f2;
    
    f0();
    f2(4, 5);
    

    有可能做这样的事情吗?或者我必须根据输入参数计数创建几个“FuntionPointer”模板。

    编辑

    是否有可能以某种方式利用 std::bind 来完成这项任务?使用 std::bind 我可以拥有 std::function<void()> f = std::bind(test, 2, 5);
    编辑 2

    实际用例:我有一个触发系统,我想将函数指针分配给 Action ,所以当 Action 发生时,函数被调用。
    伪代码示例:
    structure Trigger 
    {
       Function f;
    }
    
    Init:
      Trigger0.f = pointer to some function ()
      Trigger1.f = pointer to some function (a, b)
    
    Input: 
      Find Trigger by input
      if (in == A) Trigger.f();
      else Trigger.f(10, 20)
    

    或者如果可能的话
    Input:
      Find Trigger by input
      if (in == A) f = bind(Trigger.f);
      else f = bind(Trigger.f, 10, 20);
      f()
    

    最佳答案

    如果 std::function对你来说不是必需的,你可以创建一个代理类。

    class fn_t {
    public:
      typedef void (*fn_1_t)();
      typedef void (*fn_2_t)(int, int);
      fn_1_t fn_1;
      fn_2_t fn_2;
      fn_t operator=(fn_1_t func_1) { fn_1 = func_1; return *this; }
      fn_t operator=(fn_2_t func_2) { fn_2 = func_2; return *this; }
      void operator()() { (*fn_1)(); }
      void operator()(int a, int b) { (*fn_2)(a, b); }
    };
    
    #include <iostream>
    using namespace std;
    
    void first() {
      cout << "first" << endl;
    }
    
    void second(int a, int b) {
      cout << "second " << a << " : " << b << endl;
    }
    
    int main() {
      fn_t f;
      f = &first;
      f = &second;
      f();
      f(5, 4);
      return 0;
    }
    

    类(class) fn_t自动使用你想要的两个原型(prototype),自动分配一个需要的原型(prototype),它可以通过重叠 () 来调用两个原型(prototype)的函数具有适当参数的运算符。

    您可能需要检查函数指针的有效性 fn_1fn_2但我没有包括这个检查最小化。

    这样做的好处是你只需要 C++,甚至不需要 STL 和 Boost。

    关于具有不同参数的 C++ std::function 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32823046/

    相关文章:

    C++11 文件流

    c++11 - 编译器声明的隐式移动构造函数

    c++ - C++ "concept"和鸭子类型(duck typing)之间有什么关系?

    c++ - 这个元编程是如何编译下来的?

    c++ - 使用 istream 从命名管道读取

    c++ - 有9次破坏怎么解释?

    c++ - 我应该主要在容器上使用 shared_ptr 还是 weak_ptr?

    c++ - Soci 作为 linux/ubuntu 上的静态库?

    c++ - 较高 n 值的段错误(例如 n=999997)

    c++ - 使用带有增量迭代器的 std::find