使用带有std :: function和std :: bind

时间:2017-10-15 11:36:08

标签: c++ c++11 std-function stdbind

我正在尝试创建一个模板类,该模板类又会在函数上生成包装器。然后,类将返回包装器作为结果。我想使用模板来使用可以使用具有不同签名的任何函数的通用类,例如:

  1. std::function<void()>task = std::bind(fun1, param1, param2);
  2. std::function<int(int, int)>task = std::bind(fun2, param1, param2);
  3. 我想有这样的事情:

    template <typename T1, typename T2>
    class A {
      A (string param1, string param2) {
        // The created wrapper here i.e. 'task' will be returned by the class.
        function<T1>task = bind(T2, param1, param2);
      }
    
      // Return the created wrapper in the constructor.
      function<T1> returnWrapper() {
        return task;
      }
    };
    

    上面的代码主要是一个伪代码,因为它无法编译,但可以了解我在寻找什么。这有什么解决方案吗?我认为应该不仅仅是为函数的签名使用模板。任何帮助将受到高度赞赏。如果可能的话,我也希望能够将任意数量的参数传递给'bind'。

1 个答案:

答案 0 :(得分:0)

我想我解决了这个问题!我必须定义一个类,它在模板中接受两个类型名称,并在currying后将其中一个传递给std :: function作为函数签名,并使用构造函数中的第二个来定义std中的curried函数(包装后的结果函数) ::绑定。一切都很好!可能有一些更好的解决方案,但这是我得到的最好的,或多或少的清晰解决方案。这是我找到的解决方案的片段!希望它能帮助对方解决同样的问题:

#include <iostream>
#include <functional>

using namespace std;

class A {
  private:
    template <typename T1, typename T2>
    class B { 
      private:
        function<T1>ff;

      public:
        B(T2 fun) {
          ff = bind(fun, 1, placeholders::_1);
        }

        virtual ~B() {
        }

        int exec(int x) {
          return ff(x);
        }
    };

    static int myFun(int x, int y) {
      return x + y;
    }

  public:
    A() { 
    };

    int test() {
      B<int(int), int (*)(int, int)> b(&myFun);
      return b.exec(10);
    }

    virtual ~A() {
    };
};

int main() {
  A a;

  // Correct result is '11' since we pass 11 and 1 is in the curried function.
  cout << "test result: " << a.test() << endl;

  return 0;
}