Затухание массива к указателям в шаблонах

Я думаю, что можно сделать что-то вроде этого, синтаксис мог бы быть неправильным, не использовали C# в некоторое время, Чтобы получить последний объект

Dictionary<string, int>.KeyCollection keys = mydict.keys;
string lastKey = keys.Last();

или использовать Max вместо В последний раз для получения макс. значения, я не знаю, какой соответствует коду лучше.

6
задан M.M 16 November 2015 в 10:54
поделиться

3 ответа

Используйте ссылочный тип для параметра

template<typename T> void f(const T& x) 
{
  std::cout << sizeof(T);
}

, и в этом случае тип массива не изменится.

Точно так же вы также можете предотвратить распад в исходной версии f , если вы явно укажете шаблон agument T как тип ссылки на массив

f<int (&)[27]>(array);

В исходном пример кода, принуждение аргумента T иметь тип массива (т. е. не ссылочный тип массива, используя typeof или явно указывая тип), не предотвратит распад типа массива. Хотя T сам по себе будет обозначать тип массива (как вы заметили), параметр x по-прежнему будет объявлен как указатель, а sizeof x по-прежнему будет оценивать указатель размер.

9
ответ дан 8 December 2019 в 18:37
поделиться

You can also use templates like the following:

template <typename T, std::size_t N>
inline std::size_t number_of_elements(T (&ary)[N]) {
    return N;
}

This little trick will cause compile errors if the function is used on a non-array type.

1
ответ дан 8 December 2019 в 18:37
поделиться

В зависимости от вашего варианта использования, вы можете обойти это , используя ссылки :

template<typename T>
void f(const T& x) {
    std::cout << sizeof(T);
}

char a[27];
f(a);

Это печатает 27 , по желанию.

1
ответ дан 8 December 2019 в 18:37
поделиться
Другие вопросы по тегам:

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