]> git.tdb.fi Git - libs/core.git/blob - source/core/meta.h
a13f5cb3a5714de60aba9a7bdc5682370aac110a
[libs/core.git] / source / core / meta.h
1 #ifndef MSP_CORE_META_H_
2 #define MSP_CORE_META_H_
3
4 #include <cstddef>
5
6 namespace Msp {
7
8 template<typename T>
9 struct RemoveConst
10 { typedef T Type; };
11
12 template<typename T>
13 struct RemoveConst<const T>
14 { typedef T Type; };
15
16
17 template<typename T>
18 struct RemoveReference
19 { typedef T Type; };
20
21 template<typename T>
22 struct RemoveReference<T &>
23 { typedef T Type; };
24
25
26 template<bool c, typename R>
27 struct EnableIf;
28
29 template<typename R>
30 struct EnableIf<true, R>
31 { typedef R Yes; };
32
33 template<typename R>
34 struct EnableIf<false, R>
35 { typedef R No; };
36
37
38 /**
39 Common fragments used in SFINAE-based decider constructs.
40 */
41 struct Sfinae
42 {
43         struct Yes { char c[2]; };
44         struct No { char c; };
45
46         template<size_t s>
47         struct Evaluate
48         {
49                 enum { value = (s==sizeof(Yes)) };
50         };
51 };
52
53 } // namespace Msp
54
55 #endif