21

我已经定义了名为的类模板CallBackAtInit,其唯一目的是在其初始化(构造函数)时调用一个函数。该函数在模板参数中指定。问题是模板不接受std::function作为参数;但他们接受函数指针。为什么?

这是我的代码:

#include <iostream>
#include <functional>

/* Does not work:*/     template <typename return_type, typename arg_type, std::function<return_type(arg_type)> call_back>
/* Work fine: *///      template <typename return_type, typename arg_type, return_type(*call_back)(arg_type)>

class CallBackAtInit {
public:
    CallBackAtInit(arg_type arg)
    {
        call_back(arg);
    };
};

void printInt(int i);

class HoldInt : private CallBackAtInit<void, int, printInt> {
public:
    HoldInt(int integer)
    : CallBackAtInit(integer)
    {}
    // ...
};

int main(int argc, char** argv)
{
    HoldInt hi(10);
    return 0;
}

void printInt(int i)
{
    std::cout << i << std::endl;
}
4

2 回答 2

14

模板定义的参数可以有四种:

  • 只能接受类型(或模板类型)的参数。
  • 只能接受整数值的参数。
  • 只能接受指向成员值的指针的参数
  • std::nullptr_t(C++11 起)

当您std::function在模板定义中提及时,它既不属于上述类别。模板不能接受类型,也不能接受整数值指向成员值的指针

当参数是函数指针类型时,它可以接受函数指针(与类型匹配的函数的地址),它只是一个整数值。请注意,地址始终是一个整数值。所以它属于第二类,这就是它起作用的原因。

于 2012-12-01T16:49:19.970 回答
2

因为标准不允许:

14.1 模板参数

4 非类型模板参数应具有以下类型之一(可选 cv 限定):

— 整数或枚举类型,

— 指向对象的指针或指向函数的指针,

— 对对象的左值引用或对函数的左值引用,

— 指向成员的指针,

— std::nullptr_t。

于 2012-12-01T16:48:42.510 回答