Получить базовый тип шаблона типа (удалить const / reference / etc.)

Есть ли шаблон типа черт, который возвращаетбазовый тип данного типа. Отбазовый тип Я имею в виду тип со всеми модификаторами значений, const, volatile и т. Д. Например, используя функцию гипотетических черт: I '

base::type == int
base::type == int
base::type == int

я в курсеremove_const а такжеremove_reference и в настоящее время просто использую их в комбинации. Я'Мне интересно, если, однако, уже существует такая черта и, возможно, если есть собственное имя, что я имею в виду?

 Andy Prowl25 мая 2013 г., 14:31
typename std::remove_cv::type
 edA-qa mort-ora-y25 мая 2013 г., 14:32
@AndyProwl, да, этоs, что я делаю сейчас ... Я думаю, это охватывает все способы ссылки на тип.

Ответы на вопрос(3)

Решение Вопроса

template<typename t="">
using base_type = typename std::remove_cv<typename std::remove_reference<t="">::type>::type;
</typename></typename>

Заметить, чтоВот Р. Мартиньо Фернандес предлагает имяUnqualified для такого типа псевдоним.

Черта стандартного типаstd::decay, с другой стороны, делает то же самое, что и вышеа также нечто большее для массивов и типов функций, которые могут быть или не быть тем, что вы хотите.

 chris25 мая 2013 г., 14:49
по крайней мере проверю MSVC.
 chris25 мая 2013 г., 14:59
@AndyProwl, я проверил, и MSVC делает настоящий шаблон идентификации для него. Я думал, что те, казалось, столкнулись. Там'Ни в коем случае нельзя было сообщить об этом как об ошибке в GCC (кажется маловероятным).
 N0vember18 апр. 2017 г., 23:58
Я немного запутался, пытаясь использовать код этого ответа: если вы хотите, чтобы base_type вел себя как черты типа std, вы должны удалить последний::type, право ? потому что в текущей форме для его использования нужно написатьbase_type и неbase_type::type
 Andy Prowl25 мая 2013 г., 15:06
@ Крис: Это действительно странно. Я проверил C ++ 14 Draft и он также указывает, что он должен вести себя как личность
 Andy Prowl25 мая 2013 г., 14:44
@ Крис: Да этосмущает. Может я'я что-то упустил, но неСтандарт определяет, чтоcommon_type должно бытьT когда есть только один тип аргумента?
 chris25 мая 2013 г., 14:46
Я знаю, что это работает как шаблон личности, но из того, что яЯ видел, все, что он удаляет, это cv и ссылки. Я неЯ не знаю, делает ли это что-то еще.
 Andy Prowl25 мая 2013 г., 14:48
@ Крис: Моя точка зрения, согласно Стандарту, это не должноудалить резюме и ссылки, так чтоМожет быть, это ошибка?
 chris25 мая 2013 г., 14:39
Как работаетUnqualified один сравнить сstd::common_type (Я сделалтестовое задание это даже собе черты)?
 Andy Prowl25 мая 2013 г., 15:05
@KonradRudolph: я нене знаю об этой библиотеке, спасибо за это

std::decay, Он подражает тому, что происходит, когда вы передаете аргументы функциям по значению: обрезает cv-квалификаторы верхнего уровня, ссылки, преобразует массивы в указатели, а функции - в указатели на функции.

С уважением, &rzej

станд :: Распад может быть то, что вы ищете (удаляет ссылки,const/volatile, распадает массив на указатель и функцию на указатель на функцию). Если вы неДля того, чтобы массив указатель и функция для функции указатель распада, вам нужно придерживатьсяstd::remove_reference а такжеstd::remove_cv (удаляетconst а такжеvolatile). Конечно, вы можете объединить их в свой типографский режим, чтобы упростить его использование.

 Adrian20 мар. 2018 г., 22:16
C ++ 20 представил именно это. Это'называется.std::remove_cvref

Ваш ответ на вопрос