如何理解`int (*(const char*, std::_Placeholder<2>))(const char*, ...)`类型?
解读std::bind生成的复杂函数指针类型
原始代码
#include <cstdio> #include <functional> int main() { auto f = std::bind(printf, "%d", std::placeholders::_2); }
展开后的代码(cppinsights工具处理后)
#include <cstdio> #include <functional> int main() { std::_Bind<int (*(const char *, std::_Placeholder<2>))(const char *, ...)> f = std::bind(printf, "%d", std::placeholders::_2); return 0; }
一、拆解int (*(const char *, std::_Placeholder<2>))(const char *, ...)类型
用C++的右左法则逐步拆解这个类型:
- 整体是一个函数类型,核心结构为
返回值指针类型(参数列表)(底层函数的参数)。 (const char *, std::_Placeholder<2>)是该函数的参数列表:表示这个函数接受两个参数,第一个是const char*类型的字符串指针,第二个是std::_Placeholder<2>占位符对象(对应代码里的std::placeholders::_2)。- 中间的
(*...)表示函数的返回值是一个指针,指针指向的是int(const char*, ...)类型——也就是指向printf风格的函数指针:接受格式字符串和可变参数,返回int类型(对应printf的返回值)。
简单总结:这个类型描述的是接受const char*和占位符_2作为参数,返回一个指向printf风格函数的指针的函数类型。
二、给这个类型命名
可以用using或typedef简化复杂类型,提升可读性:
方式1:用using(C++11及以上推荐)
// 先定义底层的printf风格函数指针类型 using PrintFuncPtr = int(*)(const char*, ...); // 再定义目标函数类型 using BoundFuncType = PrintFuncPtr(const char*, std::_Placeholder<2>);
方式2:用typedef(兼容旧标准)
// 定义printf风格函数指针类型 typedef int(*PrintFuncPtr)(const char*, ...); // 定义目标函数类型 typedef PrintFuncPtr BoundFuncType(const char*, std::_Placeholder<2>);
内容的提问来源于stack exchange,提问作者Auri Aiur
相关产品推荐
相关产品推荐

