Как передать тип переменной шаблонному методу?

#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 в свою функцию, чтобы значение не копировалось