如何封装std::函数

How to encapsulate std::function

本文关键字:std 函数 封装 何封装      更新时间:2023-10-16

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

```