如何封装std :: function

时间:2016-04-18 19:33:15

标签: c++ c++11

我正在尝试创建一个具有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;
}

3 个答案:

答案 0 :(得分:2)

在这一行......

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;

答案 1 :(得分: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;
}

```

答案 2 :(得分:0)

我猜你想要这样的东西:

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