C++ 11新特性之template
作者:usher2007 发布时间:[ 2016/9/8 10:47:59 ] 推荐标签:测试开发技术 C++
这是C++11新特性介绍的第八部分,涉及到template相关的新特性。
不想看toy code的读者可以直接拉到文章后看这部分的总结。
function
C++提供了很多种可调用对象,例如函数指针、lambda、重载了operator()的对象等。有时我们需要将这些对象统一管理,这时使用如下这种方式是不行的:
int add(int i, int j) { return i + j; }
struct divide
{
int operator()(int i, int j)
{
return i / j;
}
};
std::map<std::string, int(*)(int, int)>> binops = {
{"+", add},
{"-", std::minus<int>()},
{"*", [](int i, int j) {return i * j; }},
{"/", divide()},
};请在文本框输入文字
无法直接将binops中的可调用对象直接转换成int(*)(int, int)。
C++11新标准中提供了一个名为function的标准库类,可以用function来表示以上所有的函数调用,只要这些函数调用的参数类型和返回类型是一致的。
std::cout<<"test function<T>:
";
std::map<std::string, std::function<int(int, int)>> binops = {
{"+", add},
{"-", std::minus<int>()},
{"*", [](int i, int j) {return i * j; }},
{"/", divide()},
};
std::cout<<"+: "<<binops["+"](1, 2)<<"
";
std::cout<<"-: "<<binops["-"](1, 2)<<"
";
std::cout<<"*: "<<binops["*"](1, 2)<<"
";
std::cout<<"/: "<<binops["/"](1, 2)<<"
";
std::cout<<"test function<T> done.
"<<std::endl;
模板友元
在新标准中,可以声明一个类的模板参数类型为类的友元。
template<typename T> class Bar
{
friend T;
protected:
int val = 100;
};
class Foo
{
public:
void print_bar(Bar<Foo> &bar) {std::cout<<"bar: "<<bar.val<<std::endl;}
};
std::cout<<"test friend template type:
";
Bar<Foo> bar;
Foo foo;
foo.print_bar(bar);
std::cout<<"test friend template type done.
"<<std::endl;
可以看到,由于友元机制,在Foo中可以直接访问到Bar的protected属性。
模板别名
新标准中,可以使用using为模板声明别名。
template<typename T> using twin = std::pair<T, T>;
template<typename T> using str_int = std::pair<T, int>;
std::cout<<"test template alias:
";
twin<std::string> twin_str = {"abc", "def"};
std::cout<<"twin_str: "<<twin_str.first<<' '<<twin_str.second<<std::endl;
str_int<std::string> strno = {"abc", 100};
std::cout<<"strno: "<<strno.first<<' '<<strno.second<<std::endl;
std::cout<<"test template alias done.
"<<std::endl;
可以看到,在声明str_int的时候,还可以用某一类型部分实例化模板。这是一个挺好用的特性。
默认参数
新标准中,可以像为函数提供默认参数一样,为模板参数提供默认值。
template<typename T, typename F=std::less<T>>
int compare(const T &v1, const T &v2, F f=F())
{
if(f(v1, v2)) return -1;
if(f(v2, v1)) return 1;
return 0;
}
std::cout<<"test default template parameter:
";
std::cout<<"compare int 1 2: "<<compare(1, 2)<<std::endl;
std::cout<<"compare int 2.0 1.0: "<<compare(2.0, 1.0)<<std::endl;
//std::cout<<"compare int 2.0 1: "<<compare(2.0, 1)<<std::endl; // wrong. can't determine which type is T
std::cout<<"test default template parameter done.
"<<std::endl;
尾置返回类型
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11