类型推导背景知识
例子1 python print()
这些编译器功能减轻了写代码的负担,比如我们可以利用模板类型推导,实现python中的print
函数,
#include <iostream>
auto print() {}
template<class T, class... Ts>
auto print(T x, Ts... args) {
std::cout << x << ",";
print(args...);
}
int main() {
print("12.3", "+", 12, "=", 24.3);
return 0;
}
输出如下:
12.3,+,12,=,24.3,
这段代码中,编译器帮助我们简化了如下工作:
- 模板的自动类型推导(c++17):
main
函数调用print
时并不需要
print<std::string, std::string, int, std::string, double>(...)
- 可变长模板,自动的递归。因为print对于每个输入都是等价的,所以多个输入的逻辑只需要定义一次。
例子2:run()
同样的可变长模板,还可以用于推导函数类型。比如以下的run()
实现了任意数量的任意操作
#include <iostream>
auto run() {}
template<class Fn, class... Fns>
auto run(Fn&& fn, Fns&&... fns) {
fn();
run(fns...);
}
int main () {
int ans = 1;
auto add = [&](){ans++;};
auto sl = [&](){ans<<=1;};
run(add, sl, add, sl, add, add, sl);
std::cout << ans;
return ans;
}