随笔

1.8k words

可变参数模板

可变参数模板是C++11引入的一个特性,它允许定义一个接受任意数量参数的模板.

在函数模板或类模板中,我们可以使用可变参数模板来定义接受任意数量参数的函数或类。可变参数模板使用了模板参数包(template parameter pack),它允许我们将零个或多个模板参数打包成一个参数集合。

1
2
3
4
5
6
7
8
9
template <typename T>
T sum(T arg){
return arg;
}

template<typename T,typename...Args>
T sum(T first ,Args...res){
return first+sum(rest...);
}

尾部类型推导

当需要使用尾部类型推导的时候,通常是因为函数的返回类型依赖于函数参数或其他的上下文.

1
2
3
4
5
6
7
8
9
10
11
12
auto add=[](int x,int y)->int {
return x+y;
}
auto add=[](int x,int y)->auto
{
return x+y;
}
//函数模板
template<typename T, typename U>
auto multiply(T x, U y) -> decltype(x * y) {
return x * y;
}

std::accumulate

std::accumulate 是 C++ 标准库 <numeric> 头文件中提供的一个算法函数,用于计算给定范围内的元素的总和。它接受一个起始迭代器和一个终止迭代器,以及一个初始值,然后对范围内的元素进行累加,并返回结果。

它的基本语法如下:

1
2
cppCopy codetemplate< class InputIt, class T >
T accumulate( InputIt first, InputIt last, T init );

其中:

  • InputIt 是起始迭代器和终止迭代器的类型。
  • first 是范围的起始迭代器。
  • last 是范围的终止迭代器(不包括在范围内)。
  • init 是初始值,用于累加元素。

decltype

decltype 是 C++11 引入的一个关键字,用于获取表达式的类型。它可以用于声明变量、函数返回类型、模板参数等地方。

1
decltype(expression)

std::bind

链接

std::bind的头文件是

解释

std::result_of

std::result_of 是一个 C++11 标准库中的模板工具,用于获取函数对象的返回类型。它可以用于在编译时确定函数对象的返回类型,而不需要实际调用该函数对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <type_traits>

int add(int a, int b) {
return a + b;
}

int main() {
// 获取 add 函数的返回类型
typedef std::result_of<decltype(add)&(int, int)>::type result_type;

// 输出返回类型
std::cout << "Result type: " << typeid(result_type).name() << std::endl;

return 0;
}

std::result_ofdecltype 都是用于获取表达式的类型,但它们之间有一些区别:

  1. 用法
    • std::result_of 用于获取函数对象的返回类型,而不需要实际调用该函数对象。它是一个模板类,需要指定函数对象的类型和参数类型。
    • decltype 用于获取表达式的类型,可以是任意的表达式,不仅限于函数调用。它是一个关键字,可以直接用于变量声明、返回类型推断等地方。
  2. 适用范围
    • std::result_of 主要用于获取函数对象的返回类型,因此在涉及函数对象的场景下更为常见。
    • decltype 不仅可以用于函数调用,还可以用于变量声明、表达式的类型推断等场景,更为灵活。
  3. 语法
    • std::result_of 的语法是模板类模板参数,需要传递函数类型和参数类型。
    • decltype 的语法更为灵活,可以直接对任意表达式使用。

std::filesvstem

cppreference

csdn