Кто-то может объяснить этот шаблон кода, который дает мне размер массива? [дубликат]

Если вы хотите, чтобы этот метод можно было использовать таким образом. Вот объект Data, который вы хотите использовать ex: Data = '{result: true, count: 1}'

try {
  eval('var obj=' + Data);
  console.log(obj.count);
}
catch(e) {
  console.log(e.message);
}

Этот метод действительно помогает в Nodejs Если вы работаете с программированием последовательного порта

62
задан marsol0x 12 January 2009 в 21:54
поделиться

3 ответа

Ну, сначала необходимо понять, что попытка вытащить значение из массива может дать Вам подсказку к своему первому элементу:

int a[] = {1, 2, 3};
int *ap = a; // a pointer, size is lost
int (&ar)[3] = a; // a reference to the array, size is not lost

Ссылки относятся к объектам с помощью своего точного типа или своего типа базового класса. Ключ - то, что шаблон берет массивы ссылкой. Массивы (не ссылки на них) как параметры не существуют в C++. Если Вы дадите параметру тип массива, это будет указатель вместо этого. Так использование ссылки необходимо, когда мы хотим знать размер переданного массива. Размер и тип элемента автоматически выведены, поскольку обычно имеет место для шаблонов функций. Следующий шаблон

template<typename T, size_t n>
size_t array_size(const T (&)[n]) {
    return n;
}

Названный с нашим ранее определенным массивом a неявно инстанцирует следующей функции:

size_t array_size(const int (&)[3]) {
    return 3;
}

, Который может использоваться как это:

size_t size_of_a = array_size(a);
<час>

существует изменение, которое я составил некоторое время назад [Редактирование: оказывается, что у кого-то уже была та же самая идея здесь ] , который может определить значение во время компиляции. Вместо того, чтобы возвратить значение непосредственно, это дает шаблону тип возврата в зависимости от n:

template<typename T, size_t n>
char (& array_size(const T (&)[n]) )[n];

Вы говорите, имеет ли массив n элементы, тип возврата является ссылкой на массив, имеющий размер n и тип char элемента. Теперь, можно добраться, время компиляции определило размер переданного массива:

size_t size_of_a = sizeof(array_size(a));

, поскольку массив [1 112] наличие n элементы имеет sizeof n, который даст Вам число элементов в данном массиве также. Во время компиляции, таким образом, можно сделать

int havingSameSize[sizeof(array_size(a))];

, поскольку функция никогда на самом деле не вызывается, она не должна быть определена, таким образом, она не имеет тела. Надежда я мог разрешить вопрос немного.

89
ответ дан Johannes Schaub - litb 7 November 2019 в 13:11
поделиться

Думайте о нем этот путь, предположите, что у Вас был набор функций:

// Note that you don't need to name the array, since you don't
// actually reference the parameter at all.
size_t array_size(const int (&)[1])
{
    return 1;
}

size_t array_size(const int (&)[2])
{
    return 2;
}

size_t array_size(const int (&)[3])
{
    return 3;
}
// etc...

Теперь, когда Вы называете это, какая функция вызвана?

int a[2];
array_size(a);  

Теперь, если Вы templatize arraysize, Вы добираетесь:

template <int n>
size_t array_size(const int (&)[n])
{
    return n;
}

компилятор попытается инстанцировать версии array_size, который соответствует любому параметру, с которым Вы называете его. Таким образом, при вызове его с массивом 10 ints это инстанцирует array_size с n=10.

Затем, просто templatize тип, таким образом, можно назвать его с больше, чем просто международными массивами:

template <typename T, int n>
size_t array_size(const T (&)[n])
{
    return n;
}

И Вы сделаны.

Редактирование : примечание о (&)

круглые скобки необходимы вокруг & для дифференциации между массивом международных ссылок (недопустимых) и ссылочных к массиву ints (что Вы хотите). Так как приоритет [] выше, чем [1 110], если у Вас есть объявление:

const int &a[1];

из-за приоритета оператора, Вы заканчиваете с массивом с одним элементом ссылок константы на интервал, Если Вы хотите & примененный сначала, необходимо вызвать это с круглыми скобками:

const int (&a)[1];  

Теперь Вы имеют ссылку константы на один массив элемента ints. В списке параметра функции Вы не должны определять название параметра, если Вы не используете его, таким образом, можно отбросить имя, но сохранять круглые скобки:

size_t array_size(const int (&)[1])
21
ответ дан Eclipse 7 November 2019 в 13:11
поделиться

Ничего не происходит с массивом. Это - неиспользованный параметр, который используется для разрешения подписи шаблонной функции.

Это также не может использоваться в качестве аргумента шаблона, но это - отдельная гнида.

1
ответ дан Tim Cooper 7 November 2019 в 13:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: