Сохраняйте изменчивость во вложенных типах - PullRequest
0 голосов
/ 28 февраля 2019
template<typename T>
struct S {
    using type = T;
};

volatile S<int> s;

template<typename T>
void f(T& v) {
    using n = typename T::type;

    S<n>::_; // to show

}

int main() {
     f(s);
}

В f T выводится в volatile S<int>, но n - это только int.Что мне нужно сделать, чтобы сохранить volatile, то есть, чтобы n было volatile int?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Для приколов.Если вам нужно часто делать подобные вещи, можно заключить их в мета-функцию.Вот возможная реализация в :

#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, он также не будет.В противном случае он выставляет тот же тип, перенаправляя на него квалификаторы.

Здесь это , когда применяется к вашему примеру.

0 голосов
/ 28 февраля 2019
using n = typename std::conditional< std::is_volatile<T>::value, 
            volatile typename T::type,
            typename T::type >::type;

Добавляет volatile к n, если T равно volatile.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...