2013-05-21 12 views
11

È possibile dichiarare o meno una variabile membro in base alle condizioni del modello senza utilizzare il tipo vuoto fittizio?Dichiarare membro o meno in base al parametro modello

Esempio:

struct empty{}; 
struct real_type{}; 

template<bool condition> 
struct foo 
{ 
    typename std::conditional<condition, real_type, empty>::type _member; 
}; 

risposta

11

È possibile derivare da un modello che ha una specializzazione:

struct real_type { }; 

template<bool c> 
struct foo_base { }; 

template<> 
struct foo_base<true> 
{ 
    real_type _member; 
}; 

template<bool condition> 
struct foo : foo_base<condition> 
{ 
}; 

Come un piccolo test:

int main() 
{ 
    foo<true> t; 
    t._member.x = 42; // OK 

    foo<false> f; 
    f._member.x = 42; // ERROR! No _member exists 
} 
+0

@MikeSeymour: Destra, avanzi :) Grazie, a cura –

+0

Grande! In questo modo non avrò strutture "vuote" nella mia classe quando la condizione è falsa – Felics

+0

@Felics: Sì, è corretto –

0

E 'possibile dichiarare o non una variabile membro in base alle condizioni del modello senza usare dummy tipo vuoto?

io credo che si possa anche specializesenza la derivazione. Questo è stato testato correttamente con entrambi gli standard -std=c++03 e -std=c++11.

template<bool condition> 
struct foo; 

template<> 
struct foo<true> 
{ 
    real_type _member; 
}; 

template<> 
struct foo<false> 
{ 
}; 

Di certo sarebbe stato bello se il comitato di C++ ci ha dato quello che volevamo/bisogno:

template<bool condition> 
struct foo 
{ 
#if (condition == true) 
    real_type _member; 
#endif 
}; 
Problemi correlati