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