C++11/14特性系列
1. variadic templates (可变参数模板)
// 需要处理最后一个无参的情况
void print( ){
}
template <typename... Types>
void print(const Types&... args){
print("ss", args...);
}
// 可变参数模板 用于递归 (传参类型为包,可以不同)
template <typename T, typename... Types>
void print(const T &farg, const Types&... args){
cout << farg << endl;
print(args...);
}
2. auto 自动类型推导
int main( ){
vector<int> f = {1, 2, 3, 4, 5};
vector<int>::iterator ft;
ft = f.begin( );
auto it = f.begin( );
// ft 和 it 都是迭代器,auto能够自动识别推导相应的类型,进行声明
cout << *ft << endl;
cout << *it << endl;
return 0;
}
3. initializer_list<> 初始化列表
// 传递给 initializer_list,一定是 initializer_list 或者 {...} 形式
void print(std::initializer_list<int> vals){
std::cout << "here\n";
for (auto p = vals.begin( ); p != vals.end( ); ++p){
std::cout << *p << "\n";
}
}
print({1, 2, 3, 4, 5});
// --------------------------------------------------------
class P{
public:
P(int a, int b){
std::cout << "P(int, int), a = " << a << ", b = " << b << endl;
}
P(initializer_list<int> initlist){
std::cout << "P(initializer_list<int>, values = ";
for (auto i : initlist){
std::cout << i << " ";
}
std::cout << std::endl;
}
};
P p(77, 5); // P(int, int), a = 77, b = 5
P q{77, 5}; // P(initializer_list<int>, values = 77 5
P r{77, 5, 42}; // P(initializer_list<int>, values = 77 5 42
P s = {77, 5}; // P(initializer_list<int>, values = 77 5
如果没有 P(initializer_list<int> initlist)
, 则 P q{77, 5}
会调用 P(int a, int b)
。