经由(函数对象)类(可变参数)模板函数包装(Function wrapper via (functi

2019-10-18 21:28发布

C ++

我想实现通过(函数对象)类(可变参数)模板的功能包装。 该类具有作为其唯一的数据成员由初始化或分配函数指针它被包裹一个函数指针。 所述参数化的构造函数采用一个函数指针和由它初始化构件。 的operator()方法采用参数(一个或多个)(或无),并与他们调用包装的函数。 至少这是这个想法。 我得到了许多错误,我与注释标记。 VC11(与2012年11月CTP,使可变参数模板)给了我error C2091: function returns function ,但在所有标记的区域之一。 最后一个错误是不同的,我的评论充分说明在代码中。 克++给出几乎相同的错误,尽管有不同的代码号。

#include <iostream>

template <typename R, typename... Tn>
class func
{
    R (*fptr)(Tn...); // C2091
public:
    func() : fptr(nullptr) {}
    func( R (*f) (Tn...) ) : fptr(f) {} // C2091
    R operator()(Tn... args)
    { // C2091
        return fptr(args...);
    }
    func& operator=( R (*f) (Tn...) ) // C2091
    {
        fptr = f;
        return *this;
    }
};

int foo(int a, int b)
{
    std::cout << "foo\n";
    return 0;
}

int main()
{
    func<int(int, int)> myfunc;
    myfunc = foo; // C2679: binary '=' : no operator found which takes
    // a right-hand operand of type 'int (__cdecl *)(int,int)' (or 
    // there is no acceptable conversion)
}

为什么会出现这些错误? 比如,我看不出参数化的构造函数如何返回什么,或者如何将数据成员的声明中返回任何东西。 是不是在函数指针声明的形式将数据成员声明? 例如,不int (*g)(int); 声明指出,它接受一个函数指针int并返回一个int

编辑/附录:

我从答案看int(int, int)只有一个类型,我需要偏特得到我想要的效果。 但是,什么产生错误在我的代码? 如果我注释掉myfunc = foo ,我还是得到了其他错误。 func<int(int, int)> myfunc; 调用默认的构造函数。 typename R被实例化int(int, int)typename... Tn变空。 数据成员R (*fptr)(Tn...); 变为R (*fptr)();fptr因此是一个函数指针指向该取零个参数,并返回的功能R 如果Rint(int, int)然后是R的函数指针型或函数型? 如果是后者,那么我可以理解错误消息的情况下。

Answer 1:

int(int, int)是一个单一类型。 如果你想传递这样的,解开它,你需要局部特殊化:

template <typename> struct func;         // leave undefined

template <typename R, typename ...Args>
struct func<R(Args...)>                  // specialized for typename = R(Args...)
{
    // ...
};


Answer 2:

你的类由参数的返回值类型和参数,分别阐述。 但是,当实例化,试图通过一个函数类型,一拉,以将其参数化std::function 。 使其func<int, int, int> myfunc; 。 随着这一变化,你的代码工作 。



Answer 3:

你需要局部特殊化。

这里有一个工作示例:

template <typename T>
class func;

template <typename R, typename... Tn>
class func<R(Tn...)> {
    typedef R (*fptr_t)(Tn...);
    fptr_t fptr;
public:
    func() : fptr(nullptr) {}
    func(fptr_t f) : fptr(f) {}
    R operator()(Tn... args) {
        return fptr(args...);
    }
    func& operator=(fptr_t f) {
        fptr = f;
        return *this;
    }
};


文章来源: Function wrapper via (function object) class (variadic) template