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