如何封装std::函数
How to encapsulate std::function
我正在尝试创建一个具有std::function
成员和operator()
的类,该类将调用所述成员。以下是我尝试过的:
template <class R, class... Args>
class Func{
public:
Func(std::function<R(Args...)> fnx) : fn(fnx) {} //Error
R operator()(Args... a) { return fn(a...); } //Error
private:
std::function<R(Args...)> fn; //Error
};
然而,我得到一个神秘的错误
error: function returning a function
在以Error
表示的行中,我不理解——我没有看到任何函数被返回。它在哪里,我该怎么修?
完全不起作用的示例:http://coliru.stacked-crooked.com/a/603a84184d9666a8
#include <iostream>
#include <functional>
int foo(int a, int b) { return a+b; }
template <class R, class... Args>
class Func{
public:
Func(std::function<R(Args...)> fnx) : fn(fnx) {}
R operator()(Args... a) { return fn(a...); }
private:
std::function<R(Args...)> fn;
};
Func<int(int,int)> foox;
int main() {
std::cout << foox(2,4);
return 0;
}
在这一行中。。。
Func<int(int,int)> foox
您将int(int,int)
传递为R
,而Args...
为空。Clang:中的错误更为明显
a.cpp:9:24: error: function cannot return function type 'int (int, int)'
Func(std::function<R(Args...)> fnx) : fn(fnx) {}
^
a.cpp:15:20: note: in instantiation of template class 'Func<int (int, int)>' requested here
Func<int(int,int)> foox;
^
a.cpp:10:5: error: function cannot return function type 'int (int, int)'
R operator()(Args... a) { return fn(a...); }
^
a.cpp:12:19: error: function cannot return function type 'int (int, int)'
std::function<R(Args...)> fn;
^
声明foox
的正确方法是Func<int, int, int> foox;
。
我想你想要这样的东西:
template<typename F>
class Func;
template<typename R, typename... Args>
class Func<R(Args...)> {
// ...
};
否则,您将以您定义的方式滥用Func
。
换句话说,以下是修复后的示例代码:
#include<functional>
#include<iostream>
int foo(int a, int b) { return a+b; }
template<typename F>
class Func;
template<typename R, typename... Args>
class Func<R(Args...)> {
public:
Func(std::function<R(Args...)> fnx) : fn(fnx) {}
R operator()(Args... a) { return fn(a...); }
private:
std::function<R(Args...)> fn;
};
Func<int(int,int)> foox{foo};
int main() {
std::cout << foox(2,4);
return 0;
}
除了正确声明foox(如前面提到的cubuspl42)之外,还缺少将所需的foo函数作为构造函数参数传递。
完整代码:
#include <iostream>
#include <functional>
int foo(int a, int b) { return a+b; }
template <class R, class... Args>
class Func{
private:
std::function<R(Args...)> fn;
public:
Func(std::function<R(Args...)> fnx) : fn(fnx) {}
R operator()(Args... a) { return fn(a...); }
};
int main() {
Func<int, int, int> foox(foo);
std::cout << foox(2,4);
return 0;
}
```
相关文章:
- 使用std::函数映射对象方法
- 可组合的lambda/std::函数与std::可选
- 当使用透明的std函数对象时,我们还需要写空的尖括号吗
- std::函数常量正确性未遵循
- 具有变量Number of Arguments的std::函数的矢量
- 从类型std::函数传递变量失败,尽管调用方期望的类型完全相同
- 如何调用存储在指向"std::函数"的指针中的 lambda?
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 如何将类 1 的 std::函数绑定到类 2 的函数?
- 如何制作可以接受任何类型的参数的 std::函数和 lambda
- 如何将 STL 队列推送函数绑定到 std::函数?
- std::函数不起作用,但普通的旧函数指针可以 - 为什么?
- 获取 std::函数以推断按引用传递/按值传递
- std::bind 和 std::函数术语不值为接受 0 个参数?
- 从其存储的回调中删除 std::函数是否安全
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 创建一个带有 lambda 的 std::函数,而不知道函数的参数
- std::函数的解释
- 在调用过程中删除 std::函数