最近学习了C++2.0版本的一些新的特性,利用initializer_list实现print。该类模板中主要有三个方法:begin()、end()迭代器以及获取区间中元素个数的方法size()
语法
initializer_list 是一种C++11新的类型特性,它允许我们以统一的方式初始化对象。它是一个代表数组的轻量级包装器,通常用于构造函数和函数参数中,以允许传递一个初始化元素列表。
-
initializer_list也是一种模板类型。
template< class T >class initializer_list;
-
包含begin()、end()迭代器以及获取区间中元素个数的方法size()方法
语言环境
Dev-C++ 5.11
并需要自己的环境是支持C++11的,例如:Dev-C++ 5.11可以通过以下步骤进行修改:
实例源码
#include <iostream>
namespace my{
void print(std::initializer_list<int> vals){
for(auto p=vals.begin();p!=vals.end();++p){
std::cout<<*p<<" ";
}
}
}
int main() {
my::print({12,3,5,7,11,12,18});
system("pause");
return 0;
}
原理
- 在调用自己实现的print时,编译器看到是以
{}
进行打包的,会自动转换为initializer_list
类型; - 利用其中提供的begin,end函数,可以依次打印出我们传入的值。
运行结果展示
注意:
- 不要起和标准库中的tuple冲突的名字,或者在自己的命名空间下;
- 要保证编译器支持C++11
- 一定要加
{}
- 与Variadic Templates不同,initializer_list<>支持的参数类型必须是相同的。
同理简单使用
#include <initializer_list>
#include <iostream>
#include <vector>
template<class T>
struct S
{
std::vector<T> v;
S(std::initializer_list<T> l) : v(l){
std::cout << "size is " << l.size() << "\n";
}
void append(std::initializer_list<T> l){
v.insert(v.end(), l.begin(), l.end());
}
std::pair<const T*, std::size_t> c_arr() const{
return {&v[0], v.size()};
}
};
int main()
{
S<int> s = {1, 2, 3, 4, 5};
s.append({6, 7, 8});
std::cout << "The vector now has " << s.c_arr().second << " ints:\n";
for (auto n : s.v)
std::cout << n << ' ';
std::cout << '\n';
}