C++11列表初始化搭配std::initializer_list和模板实现函数或类接受不确定个参数
先介绍一下C++11的几个特性
列表初始化
大概就是可以通过{}来初始化一些类型的值,比如
int a{1};
int a[3]{1,2,3};
char a[2]{'a','b'};
class A{
public:
int a;
int b;
}
A a{1,2};
上面注意类的列表初始化,当没有自定义的构造函数时,就可以使用列表初始化,且初始化的变量必须为public。
std::initializer_list
这是C++11提供的一个新的类型,并且是一种模板类型,使用时需要传递类型,可以用在传递不确定参数个数的情况下,比如一个函数我不确定需要2个参数或者3个参数,那么就可以使用initializer_list,示例代码如下
int add(std::initializer_list<int> List)
{
int sum=0;
for(auto& one:List)
{
sum+=one;
}
return sum;
}
class A{
public:
void Init(std::initializer_list<int> List)
{
for(auto& one:List)
{
m_vec.push_back(one);
}
}
void printA()
{
for(auto& one:m_vec)
{
cout<< one<<" ";
}
cout<<endl;
}
private:
vector<int> m_vec;
};
int main(){
cout<<add({1,2,3,4})<<endl;//输出10
A a;
a.Init({1,2,3,4});
a.printA();//输出 1 2 3 4
return 0 ;
}
以上便实现了不确定参数个数的传递,还可以搭配模板使用,用法如下:
template <typename T>
void printList(initializer_list<T> List)
{
for(auto& it: List)
{
cout<<it<<" ";
}
cout<<endl;;
}
template<typename T>
class A{
public:
void Init(std::initializer_list<T> List)
{
for(auto& one:List)
{
m_vec.push_back(one);
}
}
void printA()
{
for(auto& one:m_vec)
{
cout<<one<<" ";
}
cout<<endl;
}
private:
vector<T> m_vec;
};
int main()
{
printList<int>({1,2,3,4});//输出 1 2 3 4
A<char> a;
a.Init({'a','b','c'});
a.printA();//输入 a b c
return 0;
}
在使用std::initializer_list时应该注意,它只能整体赋值,赋值后不能单独修改其中的一个值,且它提供的接口仅有三个,begin() 、end()、size(),示例中我使用的C++11提供的新的for()循环,不需要使用begin()和end()