Я пробовал предыдущий ответ и был не очень успешным.
Сделайте это: -
установите инструменты разработчика Eclipse Java EE с помощью Eclipse -> Справка -> Установить новое программное обеспечение -> Работа с -> (ваш репозиторий загрузки Eclipse версии, например: ) Indigo.
В поле «Тип фильтра» установите флажок «Инструменты разработчика Eclipse Java EE».
Загрузите и установите его. Больше проблем.
using n = typename std::conditional< std::is_volatile<T>::value,
volatile typename T::type,
typename T::type >::type;
Добавляет volatile
в n
, если T
равно volatile
.
Для приколов. Если вам нужно часто делать подобные вещи, можно заключить их в мета-функцию. Вот возможная реализация в 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
, он тоже не будет. В противном случае он выставляет тот же тип, перенаправляя на него квалификаторы.
Вот это , когда применяется к вашему примеру.