Для приколов.Если вам нужно часто делать подобные вещи, можно заключить их в мета-функцию.Вот возможная реализация в c ++ 17 :
#include <type_traits>
template<class Trait, typename=void>
struct propogate_cv_to_type{};
template<class Trait>
struct propogate_cv_to_type<Trait, std::void_t<typename Trait::type>>
{ using type = typename Trait::type; };
template<class Trait>
struct propogate_cv_to_type<Trait const, std::void_t<typename Trait::type>>
{ using type = typename Trait::type const; };
template<class Trait>
struct propogate_cv_to_type<Trait volatile, std::void_t<typename Trait::type>>
{ using type = typename Trait::type volatile; };
template<class Trait>
struct propogate_cv_to_type<Trait const volatile, std::void_t<typename Trait::type>>
{ using type = typename Trait::type const volatile; };
Это дружественно к SFINAE, поэтому, если передаваемый тип не имеет члена ::type
, он также не будет.В противном случае он выставляет тот же тип, перенаправляя на него квалификаторы.
Здесь это , когда применяется к вашему примеру.