带有函数类型参数的C ++模板的语法

时间:2011-08-30 14:58:00

标签: c++ templates c++11 std-function

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

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>的{​​{1}}与相应的函数指针的类型相同。很容易想象实现。

核心语言增强支持C ++ 11中的

T。是否扩展了模板参数类型以适应可训练性?

4 个答案:

答案 0 :(得分: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;

这是一个有用的约定。

答案 1 :(得分:8)

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

void(int,float)

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

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

答案 2 :(得分:8)

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

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

pointer_namepointer_name2的类型相同:指向返回int的函数的指针,并且接受类型为float和{{1}的两个参数}} 的。请注意,这与其他类型(如char*)完全等效,区别在于您不能将变量声明为 function 类型,只有指向函数的指针

int(或std::function)的界面只占用该函数的签名。 type参数不是指向函数的指针,而是函数的类型(如上面代码中的boost::function

答案 3 :(得分:3)

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