16

我习惯于看到这样的函数指针语法

int (*pointer_name) (float, char *);
void call_function (void (*)(int), int);

在一些 C++03 函数库中,我看到以这种方式使用的类型:

abc::function<void(*)(int,float)> f;

在 C++11 中,std::function我看到了以这种方式给出的类型

std::function<void(int,float)> f;

有一个缺失(*)。为什么?

C++03与相应的函数指针具有相同的类型function<T>T很容易想象实现。

std::functionC++11 中的核心语言增强支持。是否扩展了模板参数类型以适应可调用性?

4

4 回答 4

17

std::function(及其灵感boost::function)不仅存储函数指针。它还可以存储函数对象。从这个意义上说,将函数签名作为模板参数传递类似于智能指针通常将指针的类型作为模板参数,而不是指针类型!

对比:

int* p; // indirection to an object of type int
std::unique_ptr<int> q; // indirection to an object of type int

typedef void signature_type(); // a function type

// indirection to something callable with signature_type as a signature
// i.e. f() has type void
// only work for freestanding functions however
signature_type* f;

// indirection to something callable with signature_type as a signature
// i.e. g() has type void
// not restricted to function pointers!
std::function<signature_type> g;

这是一个有用的约定。

于 2011-08-30T15:18:59.493 回答
8

这里没有什么神奇的,类型

void(int,float)

是没有名称的函数的类型。它匹配一个类似的函数void g(int x, float y)

使用模板,您不必使用函数指针,也可以使用函数类型。

于 2011-08-30T15:13:20.050 回答
8

与其他元素一样,函数具有类型,您可以在不同的上下文中使用类型或指向类型的指针。(*)您期望的缺失只是指向语法的指针。

int (*pointer_name) (float, char *);
typedef int my_function_type(float,char*);
my_function_type * pointer_name2;

pointer_name和的类型pointer_name2是相同的:指向一个函数的指针,该函数返回int并接受两个类型为floatchar*的参数。请注意,这完全等同于其他类型int,不同之处在于您不能将变量声明为函数类型,只能声明函数的指针

std::function(or )的接口boost::function只接受函数的签名。type 参数不是指向函数的指针,而是函数的类型(如my_function_type上面的代码)

于 2011-08-30T15:19:14.533 回答
3

函数类型在 C++11 中并不新鲜(参见 C++98 中的 8.3.5)。IIRC,对 TR1 和 boost 提供的改进function非常小。

于 2011-08-30T15:12:31.033 回答