C++ 如何封装std::函数
我正在尝试创建一个包含C++ 如何封装std::函数,c++,c++11,C++,C++11,我正在尝试创建一个包含std::function成员和调用所述成员的操作符()的类。以下是我尝试过的: 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 pr
std::function
成员和调用所述成员的操作符()
的类。以下是我尝试过的:
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
};
在这一行
Func-foox
…您将int(int,int)
作为R
传递,而Args…
为空。错误在叮当声中更为明显:
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;
^
a.cpp:9:24:错误:函数无法返回函数类型'int(int,int)'
Func(std::function fnx):fn(fnx){
^
a、 cpp:15:20:注意:此处请求实例化模板类“Func”
Func-foox;
^
a、 cpp:10:5:错误:函数无法返回函数类型“int(int,int)”
R运算符()(Args…a){返回fn(a…;}
^
a、 cpp:12:19:错误:函数无法返回函数类型“int(int,int)”
std::功能fn;
^
声明
foox
的正确方法是Func-foox代码>除了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;
}
#包括
#包括
intfoo(inta,intb){返回a+b;}
模板
类函数{
私人:
std::功能fn;
公众:
Func(std::function fnx):fn(fnx){
R运算符()(Args…a){返回fn(a…;}
};
int main(){
Func-foox(foo);
我猜你想要这样的东西:
template<typename F>
class Func;
template<typename R, typename... Args>
class Func<R(Args...)> {
// ...
};
也许展示正确的方法?Func foox;
即使它有效,我怀疑这不是OP所希望的正确方法。@skypjack我希望这种怀疑不会让你否决这个答案:请看:我确实包含了MCVE,不是吗?嗯,不是真的。类本身的代码很好,这是唯一包含在问题。我需要到外部站点去发现错误。据我所知,外部站点的链接应该只是添加的,但最简单的工作示例应该是问题本身的一部分。现在它有点固定了(不过我不确定是否需要复制代码)。那么为什么不直接说外部站点链接呢?MCVE是可用的,只是不是你期望的方式。我想保持问题本身的简短和清晰,所以我选择将完整代码放在链接下-仅此而已。我认为OP希望将其函数定义为Func
,而不是Func
,就像他的示例中那样@skypjack为什么不问OP?啊,你把正确的参数传递给构造函数是对的。一旦当前的参数消失,我可能会发现这个问题。你完全正确,这就是我想要实现的。我认为Func
是一个独立工作的东西,不需要声明为gen的专门化ericF
。这个问题本身也被否决了。虽然这个问题可能是基本的,但我真的不明白为什么会这样投票。
template<typename F>
class Func;
template<typename R, typename... Args>
class Func<R(Args...)> {
// ...
};
#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;
}