您可以使用模板查找数组的长度。
template<typename T, size_t N>
size_t arraylen( T(&)[N] )
{ return N; }
我想更进一步。
struct Foo
{
template< typename T, size_t N >
Foo( /* ??? */ ) : ptr(?), size(?) { }
char* ptr;
size_t size;
};
int main()
{
Foo foo("test");
const char bar[] = "test2";
Foo foo2(bar);
const char* baz = bar;
Foo foo3(baz); // compiler error.
}
然而,对于我的生活,我无法获得编译的语法。我认为我缺少的一部分是我并不真正理解T(&)[N]
的含义。
T(&)[N]
是什么意思?
如何在仍然使用模板抓取其大小的同时允许访问数组的地址?
答案 0 :(得分:6)
struct Foo
{
template< typename T, size_t N >
Foo(T(&array)[N]) : ptr(array), size(N) { }
const char* ptr;
size_t size;
};
array
是对N T数组的引用。原始代码也是如此,但参数没有给出名称。
但这确实不是在编译时计算地址。如果你考虑一下,你会发现这是不可能的。如果堆栈地址被修复,递归(以及许多其他算法)将无法工作。
请注意最后一行:
Foo foo3(baz);
仍然无法正常工作,因为baz
是指针而不是数组。