c++ - 通过(函数对象)类(可变参数)模板的函数包装器

标签 c++ function-pointers variadic-templates functor function-object

C++

我正在尝试通过(函数对象)类(可变参数)模板实现函数包装器。该类具有作为其唯一数据成员的函数指针,该函数指针由它正在包装的函数指针初始化或分配。参数化构造函数采用函数指针并通过它初始化成员。 operator()方法接受参数(或无参数)并使用它们调用包装函数。至少那是想法。我收到很多错误,我用评论标记了这些错误。 VC11(使用 2012 年 11 月的 CTP,启用可变参数模板)给我 error C2091: function returns function在除一个标记区域之外的所有区域。最后一个错误不同,我在代码中注释了它的完整描述。 g++ 给出了大部分相同的错误,尽管代码编号不同。

#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函数指针类型还是函数类型?如果是后者,那么我可以理解错误消息的上下文。

最佳答案

int(int, int) 是一种类型。如果你想像那样传递它并打开它,你需要部分特化:

template <typename> struct func;         // leave undefined

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

关于c++ - 通过(函数对象)类(可变参数)模板的函数包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19695988/

相关文章:

c++ - 如何检测标准库类型

c++ - 计算哈希值、整数类型与结构/类

c++ - c++中不使用全局变量的递归函数中的加法次数

variadic-templates - 在 D 中,如何在整个元组上指定可变参数模板约束?

c++ - 顺序独立的可变参数模板基础特化

c++ - 使用 ofstream 时出现 "expression must have a constant value"

c++ - C++中的条件运算符

c++ - 函数指针 vs 函数作为模板非类型参数

c++ - 将函数指针的 "part"作为参数传递

c++ - 类型别名允许分配任意指针,尽管 int* 是预期的