C++ 通过(函数对象)类(可变)模板的函数包装器
C++ 我试图通过(函数对象)类(可变)模板实现函数包装器。该类的唯一数据成员是函数指针,该指针由它所包装的函数指针初始化或分配。参数化构造函数接受函数指针并通过它初始化成员。C++ 通过(函数对象)类(可变)模板的函数包装器,c++,function-pointers,variadic-templates,functor,function-object,C++,Function Pointers,Variadic Templates,Functor,Function Object,C++ 我试图通过(函数对象)类(可变)模板实现函数包装器。该类的唯一数据成员是函数指针,该指针由它所包装的函数指针初始化或分配。参数化构造函数接受函数指针并通过它初始化成员。operator()方法接受参数(或无),并使用参数调用包装函数。至少是这样。我有很多错误,我用注释来标记。VC11(使用2012年11月的CTP,以启用可变模板)在所有标记区域中给出错误C2091:函数返回函数。最后一个错误是不同的,我在代码中注释了它的完整描述。g++给出了几乎相同的错误,尽管代码编号不同 #inclu
operator()
方法接受参数(或无),并使用参数调用包装函数。至少是这样。我有很多错误,我用注释来标记。VC11(使用2012年11月的CTP,以启用可变模板)在所有标记区域中给出错误C2091:函数返回函数
。最后一个错误是不同的,我在代码中注释了它的完整描述。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)
}
#包括
样板
类函数
{
R(*fptr)(Tn.;//C2091
公众:
func():fptr(nullptr){
函数(R(*f)(Tn.):fptr(f){}//c291
R运算符()(Tn…args)
{//C2091
返回fptr(参数…);
}
func&运算符=(R(*f)(Tn…)//C2091
{
fptr=f;
归还*这个;
}
};
int foo(int a,int b)
{
std::cout您的类是通过返回值和参数类型来参数化的,这两个参数是单独指定的。但是在实例化时,您尝试通过函数类型lastd::function来参数化它。使其成为func myfunc;
。通过此更改,您的代码。您的类是通过返回值和argu类型来参数化的但在实例化时,您尝试通过函数类型lastd::function
对其进行参数化。将其设置为func myfunc;
。通过此更改,您的代码。int(int,int)
是一种单一类型。如果您希望这样传递它并将其展开,则需要进行部分专门化:
template <typename> struct func; // leave undefined
template <typename R, typename ...Args>
struct func<R(Args...)> // specialized for typename = R(Args...)
{
// ...
};
template struct func;//保留未定义
样板
struct func//专门用于typename=R(Args…)
{
// ...
};
int(int,int)
是一种单一类型。如果您希望这样传递它并将其展开,则需要部分专门化:
template <typename> struct func; // leave undefined
template <typename R, typename ...Args>
struct func<R(Args...)> // specialized for typename = R(Args...)
{
// ...
};
template struct func;//保留未定义
样板
struct func//专门用于typename=R(Args…)
{
// ...
};
您需要部分专业化
下面是一个工作示例:
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;
}
};
模板
类func;
样板
类函数{
类型定义R(*fptr_t)(Tn.);
fptr_t fptr;
公众:
func():fptr(nullptr){
func(fptr_t f):fptr(f){}
R运算符()(Tn…args){
返回fptr(参数…);
}
func&运算符=(fptr\u t f){
fptr=f;
归还*这个;
}
};
您需要部分专业化
下面是一个工作示例:
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;
}
};
模板
类func;
样板
类函数{
类型定义R(*fptr_t)(Tn.);
fptr_t fptr;
公众:
func():fptr(nullptr){
func(fptr_t f):fptr(f){}
R运算符()(Tn…args){
返回fptr(参数…);
}
func&运算符=(fptr\u t f){
fptr=f;
归还*这个;
}
};
+1表示“int(int,int)
是一种单一类型。”我明白你在部分专门化中的观点。但是是什么导致了我代码中的错误?如果我注释掉myfunc=foo
行,我仍然会得到其他错误。在这种情况下,调用默认构造函数,数据成员的类型将成为指向返回int(int,int)的函数的函数指针
并接受零参数,对吗?现在,我确实不确定的部分是:通过函数返回int(int,int)
,它是试图返回函数还是函数指针?@CodeBricks:在您的代码中,R=int(int,int)
,这对于类中的许多其他构造都是无效的类型(例如,函数不能返回函数)。你是说int(int,int)
是一种函数类型,而不是函数指针类型吗?@CodeBricks:是的,它里面没有*
。指针类型是int(*)(int,int)
(在你的破译代码中应该是R*
。+1表示“int(int,int)
是一种单一类型。”我明白你在部分专门化中的观点。但是是什么导致了我代码中的错误?如果我注释掉myfunc=foo
行,我仍然会得到其他错误。在这种情况下,调用默认构造函数,数据成员的类型将成为指向返回int(int,int)的函数的函数指针
并接受零参数,对吗?现在,我确实不确定的部分是:通过函数返回int(int,int)
,它是试图返回函数还是函数指针?@CodeBricks:在您的代码中,R=int(int,int)
,这对于类中的许多其他构造都是无效的类型(例如,函数不能返回函数)。你的意思是int(int,int)
是函数类型,而不是函数指针类型吗?@CodeBricks:是的,它里面没有*
,指针类型是int(*)(int,int)
(在你的破译代码中应该是R*
).+1用于完整的工作代码和巧妙地使用typedef
并指出部分专门化的必要性。+1用于完整的工作代码和巧妙地使用typedef
并指出部分专门化的必要性。+1用于完整的工作代码,看到我制作这个类的意图模板的使用风格类似于std::function
,为了指出模板必须用3个模板参数而不是1.+1来实例化完整的工作代码,为了了解我的意图,使类模板的使用风格类似于std::function
,为了指出模板必须实例化使用3个模板参数而不是1个。