C++中数组作为函数参数如何不用同时传入大小

C++中数组作为函数参数如何不用同时传入大小

在C/C++中如果将数组作为参数传入函数通常需要同时传入数组的大小, 在使用时总是带着一个尾巴, 总是显得有些赘余.

  • 这是由于C/C++的原生数组实质上只是一个指针而已, 不像Java中的数组还带有一个存储大小的字段.

那么, C++中就真的没法优雅的只传入数组吗?答案是否定的, 虽然C++的原生数组不算是对象, 没有将大小也封装到数组中, 但是, C++的模板为我们提供了一个新的思路.

我们下面实现一个打印数组中所有元素的函数.
  • 先来看通常的做法
// 为了方便我们只考虑int数组
// print-style : [a0, a2, ,,, an]
void printArray(int arr[], size_t n) {
	std::cout << "[ ";
	for (int i = 0; i < n; ++i) {
		std::cout << arr[i] << ", ";
	}
	std::cout << "]";
} 

每次都要带一个尾巴, 对于一些强迫症患者(比如我), call起来很不爽.

那么我们如何利用模板来去掉这个尾巴呢?
在实现之前, 我们先要简单回想一下模板, 我们通常使用类型作为模板参数, 也就是typename
所以不妨先加一个typename T, 将int数组扩展所有数组

// print-style : [a0, a2, ,,, an]
template <typename T>
void printArray(T arr[], size_t n) {
	std::cout << "[ ";
	for (int i = 0; i < n; ++i) {
		std::cout << arr[i] << ", ";
	}
	std::cout << "]";
} 

但是, 其实模板参数也可是其他类型, 比如整型. 对! 整型
比如我们可以用模板实现一个两个整型求和的函数

template <int a, int b>
int sum() {
	return a + b;
}
// in main-function
int ret = sum<2, 3>(); // the ret is 5

好的, 所以, 我们可以利用一个size_t的模板参数来存储数组的大小, 并且利用编译器对模板的自动推导功能, 由传入的数组推出数组的大小

  • 实现
// print-style : [a0, a2, ,,, an]
template <typename T, size_t n>
void printArray( const T (&arr)[n] ) { // T (&arr)[n]表示的是大小为n的T类型数组的引用, 
								       // 该引用的名字为arr
	std::cout << "[ ";
	for (int i = 0; i < n; ++i) {
		std::cout << arr[i] << ", ";
	}
	std::cout << "]";
} 

// in main-function
int arr[] = {1, 2, 3, 4, 5, 6};
printArray(arr);  // STDOUT : [ 1, 2, 3, 4, 5, 6, ]
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值