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