将 C++ 模板与 std::function 和 std::bind 一起使用
Using C++ template with std::function and std::bind
我正在尝试创建一个模板 class,它会依次生成函数的包装器。 class 然后将 return 包装器作为结果。我想使用模板来获得通用的 class,它可以与具有不同签名的任何函数一起使用,例如:
std::function<void()>task = std::bind(fun1, param1, param2);
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;
}
};
上面的代码大部分是伪代码,因为它无法编译,但给出了我正在寻找的内容的想法。有什么解决办法吗?我认为应该不仅仅是简单地使用模板来进行函数签名。任何帮助将不胜感激。如果可能的话,我还希望能够将任意数量的参数传递给 'bind'。
我想我解决了问题!我必须定义一个 class ,它在模板中采用两个类型名称,并在柯里化后将其中一个作为函数签名传递给 std::function ,并在构造函数中使用第二个来定义柯里化函数(结果函数包装后)在 std::bind 中。然后一切正常!可能有一些更好的解决方案,但这是我得到的最好的、或多或少清晰的解决方案。这是我找到的解决方案的片段!希望它能帮助其他人解决同样的问题:
#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;
}
我正在尝试创建一个模板 class,它会依次生成函数的包装器。 class 然后将 return 包装器作为结果。我想使用模板来获得通用的 class,它可以与具有不同签名的任何函数一起使用,例如:
std::function<void()>task = std::bind(fun1, param1, param2);
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;
}
};
上面的代码大部分是伪代码,因为它无法编译,但给出了我正在寻找的内容的想法。有什么解决办法吗?我认为应该不仅仅是简单地使用模板来进行函数签名。任何帮助将不胜感激。如果可能的话,我还希望能够将任意数量的参数传递给 'bind'。
我想我解决了问题!我必须定义一个 class ,它在模板中采用两个类型名称,并在柯里化后将其中一个作为函数签名传递给 std::function ,并在构造函数中使用第二个来定义柯里化函数(结果函数包装后)在 std::bind 中。然后一切正常!可能有一些更好的解决方案,但这是我得到的最好的、或多或少清晰的解决方案。这是我找到的解决方案的片段!希望它能帮助其他人解决同样的问题:
#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;
}