【问题标题】:Use templates to get an array's size and end address使用模板获取数组的大小和结束地址
【发布时间】:2011-05-03 15:55:15
【问题描述】:

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

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(&amp;)[N] 的含义。

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

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

【问题讨论】:

    标签: c++ templates metaprogramming


    【解决方案1】:
    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 是指针而不是数组。

    【讨论】:

    • 我应该更改标题。我根本没有在问题中提到编译时间。我也希望baz 示例失败。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    • 1970-01-01
    相关资源
    最近更新 更多