作为函数的C阵列的大小
Size-Of C-Array as a function?
可能重复:
这是如何";阵列大小";模板功能工作?
有没有可能在C++(C++0x(中实现没有宏的NARR
?
const static pair<string,int> data[] = {
{"Montag",1}, {"Dienstag",2}, {"Mittwoch",3}, {"Donnerstag",4},
{"Freitag",5}, {"Samstag",6}, {"Sonntag",7}
};
#define NARR(A) (sizeof(A)/sizeof(*A))
const static map<string,int> german_weekdays(data, data+NARR(data));
一个简单的函数是不可能的,因为[]
失去了它的大小信息,变成了另一个点:
size_t narr(sometype arr[]) { /* won't work */ }
模板?超载?魔术
这在C++中是可能的:
template< typename T, std::size_t Size >
std::size_t size(const T (&)[Size])
{
return Size;
}
与宏解决方案相比,这种方法的优点是,如果您试图将指针传递给它,编译器会发出一条严重的错误消息。
在C++0x:中
#include <iterator>
const static map<string,int> german_weekdays(data, std::end(data));
如果您愿意,也可以使用std::begin(data)
,用于对称性或泛型[*]。而且可能你可以使用一个初始值设定项列表而不是数组。。。
[*]尽管对于完整的泛型,您可能应该这样做:
using std::begin;
using std::end;
begin(data), end(data);
原因是新的"基于范围的循环"语法相当于在没有限定的情况下使用begin
和end
,但使用std
作为ADL的关联命名空间。与std::swap
一样,类型的作者可能会提供begin
和end
函数,这些函数旨在通过ADL找到。它们可能应该提供begin()
和end()
成员函数,std::begin
和std::end
将调用这些函数。但是,如果他们提供了适用于基于范围的,而不适用于您的代码的东西,那么您将不得不争论谁应该更改。
我现在不能测试这个,因为我离开了一段时间,最新的GCC 4.6刚刚拒绝编译,但constexpr
应该会很快解决这个问题。当然,最好用史蒂夫的建议来回避这个问题。
template< typename T, size_t N >
constexpr size_t narr( T const (&)[ N ] )
{ return N; }
相关文章:
- 为什么从具有较大阵列的 SIMD 内部函数中获得的相对加速比标量更大?
- 特征:创建一个具有函数的三维阵列
- 指针阵列在一个对象数组中函数
- 将2D双阵列从C#传递到C 函数
- 迫使QbyTearray将通过的C风格阵列拥有其构造函数
- 使用高级构造函数将阵列转换为Armadillo Vec
- 恒定字符阵列的获取字符串长度函数(strlen)不是恒定表达式
- 程序停止 - 将阵列移动到函数 |C++
- 如何返回通过memcpy函数修改的两个阵列
- 在C 中构造函数中初始化C阵列的错误
- GDB打印具有虚拟函数类的非弦乐值的静态常量阵列的无效地址
- 阵列C 中两个点函数之间的距离
- 如何创建一个构造函数,该构造函数吸收char阵列
- 静态函数阵列上未解决的外部符号
- 即使阵列腐烂到指针,如何将函数的参数保留为数组,这很好
- 如何从函数返回多维垫阵列
- 如何使用struct构造函数在结构中初始化指针阵列
- std ::类似阵列的类复制构造函数
- C 的基本原理不允许函数阵列
- 动态字符串阵列构造函数和空返回