C++中std::function特化语法class function<_Res(_ArgTypes...)>含义是什么?
std::function偏特化语法解释
1. _Res(_ArgTypes...)是C++原生支持的函数类型语法
- 你看到的写法不是函数调用,它是C++类型系统内置的函数类型表示方法,语法规则就是
返回值类型(参数类型列表),用来描述一类具有相同签名的函数的类型。 - 举个例子:
void(int)就是「接收1个int类型参数、返回值为void的函数」的类型,我们平时写的函数声明void test(int a);中,test这个函数的类型就是void(int),它对应的指针类型为void(*)(int)。 - 函数类型是C++原生支持的常规类型,和int、std::string等类型的地位一致,并不是专门为模板设计的特殊语法,你可以直接用它定义别名、声明函数指针:
// 定义函数类型别名 using CalcFunc = int(int, int); int add(int a, int b) { return a + b; } // 用函数类型声明指针,等价于 int(*func_ptr)(int, int) = &add; CalcFunc* func_ptr = &add;
2. 该语法在std::function实现中的作用
- std::function的主模板本身是一个无实现的空模板,声明为:
template<typename _Signature> class function; // 主模板没有具体实现 - 你看到的是std::function的偏特化实现:当我们传入一个函数类型作为模板参数(比如
std::function<void(int)>)时,就会匹配到这个偏特化,偏特化会自动把传入的函数类型拆分成返回值类型_Res和参数类型包_ArgTypes...,类内部就可以直接使用这两个拆分出来的类型做后续处理,比如定义operator()的签名、校验可调用对象的签名是否匹配等。
3. 极简实现示例
你可以参考下面的简化demo理解这个拆分逻辑:
// 主模板 template<typename T> struct FunctionTraits; // 偏特化,匹配所有函数类型,自动拆分返回值和参数 template<typename Ret, typename... Args> struct FunctionTraits<Ret(Args...)> { using return_type = Ret; static constexpr size_t args_count = sizeof...(Args); }; // 使用示例 using Traits = FunctionTraits<int(double, char)>; // Traits::return_type 就是 int,Traits::args_count 就是 2
内容的提问来源于stack exchange,提问作者Ayrat
相关产品推荐
相关产品推荐

