2014-04-08 11 views
8

Czy jest możliwe warunkowe włączenie elementu danych o stałej lub stałej dla klasy szablonu na podstawie stałej argumentu szablonu? A może masz jakiś typedef warunkowy? Pomyślałem o używaniu std :: enable_if z std :: is_const, ale nie ma std :: is_not_const, którego mógłbym użyć.Czy można warunkowo włączyć element danych niestanowiący stałych/stałych klasy szablonu na podstawie stałej argumentu szablonu?

class A; 

template <typename T> 
class Test 
{ 
    A& m_a; // If T != const. 
    const A& m_a; // If T == const. 
}; 

Pamiętaj, że zawsze T = A.

Odpowiedz

11

Tak, można użyć std::conditional:

template <typename T> 
class Test 
{ 
    typename 
    std::conditional<std::is_const<T>::value, const A&, A&>::type 
    m_a; 
}; 
+0

Być może na to pytanie można odpowiedzieć, ponieważ jest to powiązane. Czy mając jakieś T, byłoby błędem uzyskać "czysty typ" ze std :: remove_const nawet w przypadkach, gdy T jest już nie-const? – NFRCR

+0

W porządku. 'remove_const' zwróci oryginalny typ, jeśli nie jest określony jako const. Ale zauważ, że 'remove_const ' daje 'const T &', ponieważ usuwa tylko kwalifikator najwyższego poziomu. – jrok

5

Tak, można to zrobić. Nagłówek <type_traits> ma narzędzia do tego celu.

template <typename T> 
class Test 
{ 
    typename std::conditional< 
     std::is_const<T>::value, 
     typename std::add_const<A>::type, 
     typename std::remove_const<A>::type 
    >::type m_a; 
}; 

Można nawet zrobić pomocnika do tego celu:

//T is type to modify 
//S is source type to mimic 
struct mimic_const<T, S> 
{ 
public: 
    typedef typename std::conditional< 
     std::is_const<S>::value, 
     typename std::add_const<T>::type, 
     typename std::remove_const<T>::type 
    >::type type; 
}; 

Następnie użyj go tak:

template <typename T> 
class Test 
{ 
    typename mimic_const<A, T>::type m_a; 
}; 
+0

'add_const' to tutaj trochę przesady. – jrok

+0

@jrok Zdefiniuj "przesadź" ... –

+0

Dobrze, "const A' jest wystarczający. I potrzebujesz też "typename". – jrok

Powiązane problemy