使用模板获取数组的大小和结束地址

def*_*ode 2 c++ templates metaprogramming

您可以使用模板查找数组的长度.

template<typename T, size_t N>
size_t arraylen( T(&)[N] )
{ return N; }
Run Code Online (Sandbox Code Playgroud)

我想把这个想法更进一步.

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.
}
Run Code Online (Sandbox Code Playgroud)

但是,对于我的生活,我无法获得编译的语法.我认为我缺少的一部分是我真的不明白这T(&)[N]意味着什么.

什么T(&)[N]意思?

如何在仍然使用模板获取其大小的同时允许访问数组的地址?

Mat*_*hen 6

struct Foo
{
   template< typename T, size_t N >
   Foo(T(&array)[N]) : ptr(array), size(N) { }

   const char* ptr;
   size_t size;
};
Run Code Online (Sandbox Code Playgroud)

array是对N T数组的引用.原始代码也是如此,但参数没有给出名称.

但这实际上并不是在编译时计算地址.如果你考虑一下,你会发现这是不可能的.如果堆栈地址是固定的,递归(和许多其他算法)永远不会工作.

注意最后一行:

Foo foo3(baz);
Run Code Online (Sandbox Code Playgroud)

仍然无法工作,因为baz指针不是数组.