Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过(函数对象)类(可变)模板的函数包装器_C++_Function Pointers_Variadic Templates_Functor_Function Object - Fatal编程技术网

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

C++

我试图通过(函数对象)类(可变)模板实现函数包装器。该类的唯一数据成员是函数指针,该指针由它所包装的函数指针初始化或分配。参数化构造函数接受函数指针并通过它初始化成员。
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您的类是通过返回值和参数类型来参数化的,这两个参数是单独指定的。但是在实例化时,您尝试通过函数类型la
std::function来参数化它。使其成为
func myfunc;
。通过此更改,您的代码。

您的类是通过返回值和argu类型来参数化的但在实例化时,您尝试通过函数类型la
std::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个。