【问题标题】:Using C++ template with std::function and std::bind将 C++ 模板与 std::function 和 std::bind 一起使用
【发布时间】:2017-10-15 11:36:08
【问题描述】:

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

  1. std::function<void()>task = std::bind(fun1, param1, param2);
  2. std::function<int(int, int)>task = std::bind(fun2, param1, param2);

我想要这样的东西:

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

上面的代码主要是伪代码,因为它无法编译,但可以让我了解我在寻找什么。有什么解决办法吗?我认为应该不仅仅是简单地使用模板作为函数的签名。任何帮助将不胜感激。如果可能的话,我还希望能够将任意数量的参数传递给“绑定”。

【问题讨论】:

  • 如果可以,以后怎么称呼?
  • 我没有写完整的伪代码,但目的是该类将返回包装器,以便以后可以调用它。在这种情况下,该类应返回“任务”。
  • 啊,一开始我以为你想生成一个可以容纳任何功能的通用非模板类型。但我看到类型仍然取决于函数类型T1A(string, string) 是一个构造函数,它不能返回任何东西。你的意思是task 是你以后可以访问的班级成员?或者,A 类型的对象可能可以直接调用。
  • 你绑定的是什么?这两个例子提到了一个名为fun 的东西——但是A 的构造函数没有将一个作为参数。它应该是什么,它应该来自哪里?让我们这样说吧:假设您设法按照您想要的方式实现了一个类。展示一个具体的例子来说明你将如何使用它。
  • Igor Tandetnik:我实际上想使用模板来将其用于任何类型的功能并生成任意包装器。我编辑了这个问题,所以使用了 fun1 和 fun2。我想这样使用它: function ff = A("param1", "param2");

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


【解决方案1】:

我想我解决了这个问题!我必须定义一个类,它在模板中采用两个类型名称,并在柯里化后将其中一个作为函数签名传递给 std::function,并在构造函数中使用第二个在 std 中定义柯里化函数(包装后的结果函数) ::绑定。然后一切正常!可能有一些更好的解决方案,但这是我得到的最好的,或多或少清晰的解决方案。这是我找到的解决方案的 got sn-p !希望它可以帮助其他人解决同样的问题:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    相关资源
    最近更新 更多