Bonjour,
Je dois implémenter mes propres fonction de RTTI pour avoir le nom d'un type.
Pour ce faire c'est assez simple théoriquement:
Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 class RTTI { public: template < typename Type > static Core::String GetTypeName( Type const& tInstance ); template < typename Type > static Core::String GetName(); };
Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 template < typename Type > inline Core::String RTTI::GetName() { return RTTI::GetTypeName( Type() ); } template < typename Type > inline Core::String RTTI::GetTypeName( Type const& tInstance ) { return tInstance.GetRTTIType().Name(); } // Après c'est les spécialisations... template <> inline Core::String RTTI::GetTypeName< u8 >( u8 const& /*tInstance*/ ) { return _T( "u8" ); } template <> inline Core::String RTTI::GetTypeName( u16 const& /*tInstance*/ ) { return _T( "u16" ); } template <> inline Core::String RTTI::GetTypeName( u32 const& /*tInstance*/ ) { return _T( "u32" ); } // ...
J'ai besoin de gérer les versions avec pointeurs.
Et là ça se complique, voilà ce que j'ai essayé:
Là j'ai un "error : incomplete type is not allowed"
Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 template < typename TheType > inline Core::String RTTI::GetName() { typedef typename std::conditional< std::is_pointer< TheType >::value, std::remove_pointer< TheType >::type, TheType >::type UsedType; return RTTI::GetTypeNamePtr( UsedType() ); // Retourne le nom du type + _T( '*' ) }
Là par contre c'est les spécialisations qui fail.
Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 template < typename Type > inline typename std::enable_if< std::is_pointer< Type >::value, Core::String >::type RTTI::GetTypeName( Type const& tInstance ) { return tInstance.GetRTTIType().Name(); } template < typename Type > inline typename std::disable_if< std::is_pointer< Type >::value, Core::String >::type RTTI::GetTypeName( Type const& tInstance ) { return tInstance.GetRTTIType().Name(); }
Mes autres méthodes spécialisés ne peuvent plus être utilisés.
"error : no instance of overloaded function "RTTI::GetTypeName" matches the specified type".
Information complémentaire j'utilise Intel C++ 14
Si vous avez une idée je suis preneur.
Merci
Partager