#c #templates #c 17
Вопрос:
Я думаю, что лучшее объяснение-это пример. У меня есть 2 разных переменных разных типов, и я хочу, чтобы их типовые максимальные значения:
int iVal;
size_t sVal;
auto iMax = std::numeric_limits<**??**(iVal)>::max();
auto sMax = std::numeric_limits<**??**(sVal)>::max();
Итак, есть ли способ заменить ?? с чем-то, что даст мне максимальный размер? Мне не удалось заставить ни typeof, ни typeid выполнить трюк.
Одним из изменений, которое решило бы проблему, было бы, если бы метод ::max() получал параметр, это могло бы быть достигнуто путем вычета шаблона:
auto iMax = std::numeric_limits::max(iVal);
Почему мне это нужно: я использую сторонний код, который может изменить некоторые типы, и я хотел бы быть в безопасности от этого. Я знаю о static_assert()
том , что я использую сейчас, но все же мне было интересно, существует ли метод преобразования переменных в типы для шаблонов.
Комментарии:
1. Воспользуйся
decltype(iVal)
. Обратите внимание, чтоtypeof
этого нет в стандартном C .
Ответ №1:
decltype
используется для вывода типа выражения. Здесь вы можете использовать его как:
auto iMax = std::numeric_limits<decltype(iVal)>::max();
auto sMax = std::numeric_limits<decltype(sVal)>::max();
или дополнительно вы можете сформировать функцию шаблона, чтобы сделать это за вас:
template<typename T>
auto maxof(const Tamp;){
return std::numeric_limits<T>::max();
}
а затем используйте его с помощью:
auto iMax = maxof(iVal);
auto sMax = maxof(sVal);
Комментарии:
1.
maxof
также было бы неплохо вернуть авто, ИМХО2. @OznOg ты прав, спасибо . Я внесу изменения.
3. вы также можете передать ссылку const в свою функцию, чтобы значение не копировалось