gpt4 book ai didi

c++ - 使用模板特化来区分值和(值的)数组

转载 作者:行者123 更新时间:2023-11-30 03:07:27 27 4
gpt4 key购买 nike

我正在尝试构建一个设备,该设备将对一个值(特别是 native 类型)做一件事,对 C 风格的基元数组做另一件事。

这就是我现在所拥有的,它并没有按照我的意愿行事。

#include <cstdlib>
#include <string>
#include <iostream>
#include <iomanip>

using namespace std;

template<class V> void dump_buf(const V& val)
{
cout << "val = " << val << "\n";
}

template<class A> void dump_buf(const A ary[])
{
cout << "ary size = " << sizeof(ary) << "\n";
for( size_t i = 0; i < sizeof(ary); ++i )
cout << "\t" << i+1 << " : " << ary[i] << "\n";
}

int main()
{
cout << "\n";
int i = 42;
float f = 3.14f;
unsigned fib[] = {0,1,1,2,3,5};
char s[] = "hello";
dump_buf(i);
dump_buf(f);
dump_buf(s);
dump_buf(fib);
}

这不起作用,因为 ary 是指向某物的指针类型,而不是某物数组。以上(Intel、x64 编译、VS9)的输出是:

val = 42
val = 3.14
ary size = 8
1 : h
2 : e
3 : l
4 : l
5 : o
6 :
7 : ╠
8 : ╠
ary size = 8
1 : 0
2 : 1
3 : 1
4 : 2
5 : 3
6 : 5
7 : 3435973836
8 : 3435973836

但我希望输出为:

val = 42
val = 3.14
ary size = 6
1 : h
2 : e
3 : l
4 : l
5 : o
6 :
ary size = 6
1 : 0
2 : 1
3 : 1
4 : 2
5 : 3
6 : 5

请注意,由于空终止符是数组的一部分,因此所需的字符串输出是 6 个字符而不是 5 个字符。

有什么方法可以让它工作,只使用标准 C++ 而不使用额外的库吗?

几乎任何符合标准的技术都是可以接受的。重载、模板特化、覆盖、类模板……都可以。我对几乎所有可以实现我的目标的技术都持开放态度。

最佳答案

这应该可以解决问题:

template<class A, size_t S> void dump_buf(const A (& ary)[S])
{
cout << "ary size = " << S << "\n";
for( size_t i = 0; i < S; ++i )
cout << "\t" << i+1 << " : " << ary[i] << "\n";
}

通过获取对数组的引用,而不是指向数组开头的指针,大小是已知的,并且可以作为推断的模板参数使用。

此外,请记住 sizeof 以字节为单位给出大小,因此当您确实需要数组中对象的数量时(并且不能或不想使用这样的模板) ,你想要 sizeof(ary)/sizeof(*ary)。在这两种情况下,您都需要一个真正的数组,而不是一个指向数组的指针,它已经失去了对数组大小的所有了解。

关于c++ - 使用模板特化来区分值和(值的)数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5822629/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com