C++实现模板实现不定长度的参数个数传递

2 篇文章 0 订阅

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()

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值