Используйте шаблоны, чтобы получить размер массива и конечный адрес - PullRequest
2 голосов
/ 02 ноября 2010

Вы можете использовать шаблоны, чтобы найти длину массива.

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]?

Как мне разрешить доступ к адресу массива, сохраняя его размер с помощью шаблонов?

1 Ответ

6 голосов
/ 02 ноября 2010
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 является указателемне массив.

...