首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有函数类型参数的C++模板的语法

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

Stack Overflow用户
提问于 2011-08-30 22:58:00
回答 4查看 4.3K关注 0票数 16

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

代码语言:javascript
复制
int (*pointer_name) (float, char *);
void call_function (void (*)(int), int);

在一些C++03函数库中,我看到类型是这样使用的:

代码语言:javascript
复制
abc::function<void(*)(int,float)> f;

在C++11的std::function中,我看到了这样的类型

代码语言:javascript
复制
std::function<void(int,float)> f;

缺少(*)。为什么?

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-08-30 23:18:59

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

对比:

代码语言:javascript
复制
int* p; // indirection to an object of type int
std::unique_ptr<int> q; // indirection to an object of type int

使用

代码语言:javascript
复制
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;

这是一个有用的约定。

票数 17
EN

Stack Overflow用户

发布于 2011-08-30 23:13:20

这里没有什么神奇之处,类型

代码语言:javascript
复制
void(int,float)

不带名称的函数类型。它与void g(int x, float y)这样的函数相匹配。

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

票数 8
EN

Stack Overflow用户

发布于 2011-08-30 23:19:15

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

代码语言:javascript
复制
int (*pointer_name) (float, char *);
typedef int my_function_type(float,char*);
my_function_type * pointer_name2;

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

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

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7245235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档