Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何封装std::函数_C++_C++11 - Fatal编程技术网

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的专门化eric
F
。这个问题本身也被否决了。虽然这个问题可能是基本的,但我真的不明白为什么会这样投票。
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;
}