Я думаю, что можно сделать что-то вроде этого, синтаксис мог бы быть неправильным, не использовали C# в некоторое время, Чтобы получить последний объект
Dictionary<string, int>.KeyCollection keys = mydict.keys;
string lastKey = keys.Last();
или использовать Max вместо В последний раз для получения макс. значения, я не знаю, какой соответствует коду лучше.
Используйте ссылочный тип для параметра
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
по-прежнему будет оценивать указатель размер.
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.
В зависимости от вашего варианта использования, вы можете обойти это , используя ссылки :
template<typename T>
void f(const T& x) {
std::cout << sizeof(T);
}
char a[27];
f(a);
Это печатает 27
, по желанию.