]>
git.saurik.com Git - wxWidgets.git/blob - include/wx/meta/if.h
1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: declares wxIf<> metaprogramming construct
4 // Author: Vaclav Slavik
7 // Copyright: (c) 2008 Vaclav Slavik
8 // Licence: wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
11 #ifndef _WX_META_IF_H_
12 #define _WX_META_IF_H_
16 // NB: This code is intentionally written without partial templates
17 // specialization, because some older compilers (notably VC6) don't
26 // broken VC6 needs not just an incomplete template class declaration but a
27 // "skeleton" declaration of the specialized versions below as it apparently
28 // tries to look up the types in the generic template definition at some moment
29 // even though it ends up by using the correct specialization in the end -- but
30 // without this skeleton it doesn't recognize Result as a class at all below
31 #if defined(__VISUALC__) && !wxCHECK_VISUALC_VERSION(7)
33 template<typename TTrue
, typename TFalse
> struct Result
35 // unfortunately we also need to define value here because otherwise
36 // Result::value is not recognized as a class neither and it has to be
37 // complete too -- at least make it unusable because it really, really
38 // should never be used
50 // specialization for true:
54 template<typename TTrue
, typename TFalse
> struct Result
56 struct value
: TTrue
{ };
60 // specialization for false:
62 struct wxIfImpl
<false>
64 template<typename TTrue
, typename TFalse
> struct Result
66 struct value
: TFalse
{ };
70 } // namespace wxPrivate
72 // wxIf<> template defines nested type "value" which is the same as
73 // TTrue if the condition Cond (boolean compile-time constant) was met and
74 // TFalse if it wasn't.
76 // See wxVector<T> in vector.h for usage example
77 template<bool Cond
, typename TTrue
, typename TFalse
>
80 // notice that value can't be a typedef, VC6 refuses to use it as a base
82 struct value
: wxPrivate::wxIfImpl
<Cond
>::Result
<TTrue
, TFalse
>::value
{ };
85 #endif // _WX_META_IF_H_