1 ////////////////////////////////////////////////////////////////////////////////
3 // Copyright (c) 2001 by Andrei Alexandrescu
4 // This code accompanies the book:
5 // Alexandrescu, Andrei. "Modern C++ Design: Generic Programming and Design
6 // Patterns Applied". Copyright (c) 2001. Addison-Wesley.
7 // Permission to use, copy, modify, distribute and sell this software for any
8 // purpose is hereby granted without fee, provided that the above copyright
9 // notice appear in all copies and that both that copyright notice and this
10 // permission notice appear in supporting documentation.
11 // The author or Addison-Wesley Longman make no representations about the
12 // suitability of this software for any purpose. It is provided "as is"
13 // without express or implied warranty.
14 ////////////////////////////////////////////////////////////////////////////////
15 #ifndef LOKI_TYPETRAITS_INC_
16 #define LOKI_TYPETRAITS_INC_
18 // $Id: TypeTraits.h 835 2007-08-02 19:39:02Z syntheticpp $
24 #if (defined _MSC_VER) && (_MSC_VER < 1400)
30 #pragma warning( push )
31 #pragma warning( disable : 4180 ) //qualifier applied to function type has no meaning; ignored
35 // unsigned ints = unsigned char, unsigned short int,unsigned int, unsigned long int, unsigned long long int
36 // signed ints = signed char, short int,int, long int, long long int
37 // integral = bool, char, wchar_t, or signed/unsigned ints
39 #define LOKI_IS_CONST_BIT 0
40 #define LOKI_IS_VOLATILE_BIT 1
41 #define LOKI_IS_REFERENCE_BIT 2
42 #define LOKI_IS_FUNCTION 3
44 #define LOKI_IS_FUNCTION_POINTER 4
45 #define LOKI_IS_MEMBER_FUNCTION_POINTER 5
46 #define LOKI_IS_MEMBER_POINTER 6
47 #define LOKI_IS_POINTER 7
49 #define LOKI_IS_STD_UNSIGNED_INT 8
50 #define LOKI_IS_STD_SIGNED_INT 9
51 #define LOKI_IS_STD_INTEGRAL 10
52 #define LOKI_IS_STD_FUNDAMENTAL 11
54 #define LOKI_IS_UNSIGNED_INT 12
55 #define LOKI_IS_SIGNED_INT 13
56 #define LOKI_IS_INTEGRAL 14
57 #define LOKI_IS_FLOAT 15
59 #define LOKI_IS_ARITH 16
60 #define LOKI_IS_FUNDAMENTAL 17
61 #define LOKI_IS_SIGNED_LONG 18
62 #define LOKI_IS_UNSIGNED_LONG 19
64 #define LOKI_TYPE_BITMASK(x) (1U << (x))
68 ////////////////////////////////////////////////////////////////////////////////
69 // class template IsCustomUnsignedInt
70 // Offers a means to integrate nonstandard built-in unsigned integral types
71 // (such as unsigned __int64 or unsigned long long int) with the TypeTraits
72 // class template defined below.
73 // Invocation: IsCustomUnsignedInt<T> where T is any type
74 // Defines 'value', an enum that is 1 iff T is a custom built-in unsigned
76 // Specialize this class template for nonstandard unsigned integral types
77 // and define value = 1 in those specializations
78 ////////////////////////////////////////////////////////////////////////////////
81 struct IsCustomUnsignedInt
86 ////////////////////////////////////////////////////////////////////////////////
87 // class template IsCustomSignedInt
88 // Offers a means to integrate nonstandard built-in unsigned integral types
89 // (such as unsigned __int64 or unsigned long long int) with the TypeTraits
90 // class template defined below.
91 // Invocation: IsCustomSignedInt<T> where T is any type
92 // Defines 'value', an enum that is 1 iff T is a custom built-in signed
94 // Specialize this class template for nonstandard unsigned integral types
95 // and define value = 1 in those specializations
96 ////////////////////////////////////////////////////////////////////////////////
99 struct IsCustomSignedInt
104 ////////////////////////////////////////////////////////////////////////////////
105 // class template IsCustomFloat
106 // Offers a means to integrate nonstandard floating point types with the
107 // TypeTraits class template defined below.
108 // Invocation: IsCustomFloat<T> where T is any type
109 // Defines 'value', an enum that is 1 iff T is a custom built-in
110 // floating point type
111 // Specialize this class template for nonstandard unsigned integral types
112 // and define value = 1 in those specializations
113 ////////////////////////////////////////////////////////////////////////////////
115 template <typename T>
121 ////////////////////////////////////////////////////////////////////////////////
122 // Helper types for class template TypeTraits defined below
123 ////////////////////////////////////////////////////////////////////////////////
127 #ifndef LOKI_DISABLE_TYPELIST_MACROS
128 typedef LOKI_TYPELIST_5(unsigned char, unsigned short int,unsigned int, unsigned long int, unsigned long long int) StdUnsignedInts;
129 typedef LOKI_TYPELIST_5(signed char, short int,int, long int, long long int) StdSignedInts;
130 typedef LOKI_TYPELIST_3(bool, char, wchar_t) StdOtherInts;
131 typedef LOKI_TYPELIST_3(float, double, long double) StdFloats;
132 typedef LOKI_TYPELIST_1(long) StdSignedLong;
133 typedef LOKI_TYPELIST_1(unsigned long) StdUnsignedLong;
135 typedef Loki::Seq<unsigned char, unsigned short int,unsigned int, unsigned long int, unsigned long long int>::Type StdUnsignedInts;
136 typedef Loki::Seq<signed char, short int,int, long int, long long int>::Type StdSignedInts;
137 typedef Loki::Seq<bool, char, wchar_t>::Type StdOtherInts;
138 typedef Loki::Seq<float, double, long double>::Type StdFloats;
139 typedef Loki::Seq<long>::Type StdSignedLong;
140 typedef Loki::Seq<unsigned long>::Type StdUnsignedLong;
142 template <typename U> struct AddPointer
147 template <typename U> struct AddPointer<U &>
152 template <class U> struct AddReference
157 template <class U> struct AddReference<U &>
162 template <> struct AddReference<void>
164 typedef NullType Result;
167 template <class U> struct AddParameterType
169 typedef const U &Result;
172 template <class U> struct AddParameterType<U &>
177 template <> struct AddParameterType<void>
179 typedef NullType Result;
182 template <typename T>
183 struct IsFunctionPointerRaw
188 template <typename T>
189 struct IsFunctionPointerRaw<T( *)()>
194 template <typename T,
196 struct IsFunctionPointerRaw<T( *)(P01)>
201 template <typename T,
202 typename P01, typename P02>
203 struct IsFunctionPointerRaw<T( *)(
209 template <typename T,
210 typename P01, typename P02, typename P03>
211 struct IsFunctionPointerRaw<T( *)(
217 template <typename T,
218 typename P01, typename P02, typename P03, typename P04>
219 struct IsFunctionPointerRaw<T( *)(
225 template <typename T,
226 typename P01, typename P02, typename P03, typename P04, typename P05>
227 struct IsFunctionPointerRaw<T( *)(
228 P01, P02, P03, P04, P05)>
233 template <typename T,
234 typename P01, typename P02, typename P03, typename P04, typename P05,
236 struct IsFunctionPointerRaw<T( *)(
237 P01, P02, P03, P04, P05,
243 template <typename T,
244 typename P01, typename P02, typename P03, typename P04, typename P05,
245 typename P06, typename P07>
246 struct IsFunctionPointerRaw<T( *)(
247 P01, P02, P03, P04, P05,
253 template <typename T,
254 typename P01, typename P02, typename P03, typename P04, typename P05,
255 typename P06, typename P07, typename P08>
256 struct IsFunctionPointerRaw<T( *)(
257 P01, P02, P03, P04, P05,
263 template <typename T,
264 typename P01, typename P02, typename P03, typename P04, typename P05,
265 typename P06, typename P07, typename P08, typename P09>
266 struct IsFunctionPointerRaw<T( *)(
267 P01, P02, P03, P04, P05,
273 template <typename T,
274 typename P01, typename P02, typename P03, typename P04, typename P05,
275 typename P06, typename P07, typename P08, typename P09, typename P10>
276 struct IsFunctionPointerRaw<T( *)(
277 P01, P02, P03, P04, P05,
278 P06, P07, P08, P09, P10)>
283 template <typename T,
284 typename P01, typename P02, typename P03, typename P04, typename P05,
285 typename P06, typename P07, typename P08, typename P09, typename P10,
287 struct IsFunctionPointerRaw<T( *)(
288 P01, P02, P03, P04, P05,
289 P06, P07, P08, P09, P10,
295 template <typename T,
296 typename P01, typename P02, typename P03, typename P04, typename P05,
297 typename P06, typename P07, typename P08, typename P09, typename P10,
298 typename P11, typename P12>
299 struct IsFunctionPointerRaw<T( *)(
300 P01, P02, P03, P04, P05,
301 P06, P07, P08, P09, P10,
307 template <typename T,
308 typename P01, typename P02, typename P03, typename P04, typename P05,
309 typename P06, typename P07, typename P08, typename P09, typename P10,
310 typename P11, typename P12, typename P13>
311 struct IsFunctionPointerRaw<T( *)(
312 P01, P02, P03, P04, P05,
313 P06, P07, P08, P09, P10,
319 template <typename T,
320 typename P01, typename P02, typename P03, typename P04, typename P05,
321 typename P06, typename P07, typename P08, typename P09, typename P10,
322 typename P11, typename P12, typename P13, typename P14>
323 struct IsFunctionPointerRaw<T( *)(
324 P01, P02, P03, P04, P05,
325 P06, P07, P08, P09, P10,
331 template <typename T,
332 typename P01, typename P02, typename P03, typename P04, typename P05,
333 typename P06, typename P07, typename P08, typename P09, typename P10,
334 typename P11, typename P12, typename P13, typename P14, typename P15>
335 struct IsFunctionPointerRaw<T( *)(
336 P01, P02, P03, P04, P05,
337 P06, P07, P08, P09, P10,
338 P11, P12, P13, P14, P15)>
343 template <typename T,
344 typename P01, typename P02, typename P03, typename P04, typename P05,
345 typename P06, typename P07, typename P08, typename P09, typename P10,
346 typename P11, typename P12, typename P13, typename P14, typename P15,
348 struct IsFunctionPointerRaw<T( *)(
349 P01, P02, P03, P04, P05,
350 P06, P07, P08, P09, P10,
351 P11, P12, P13, P14, P15,
357 template <typename T,
358 typename P01, typename P02, typename P03, typename P04, typename P05,
359 typename P06, typename P07, typename P08, typename P09, typename P10,
360 typename P11, typename P12, typename P13, typename P14, typename P15,
361 typename P16, typename P17>
362 struct IsFunctionPointerRaw<T( *)(
363 P01, P02, P03, P04, P05,
364 P06, P07, P08, P09, P10,
365 P11, P12, P13, P14, P15,
371 template <typename T,
372 typename P01, typename P02, typename P03, typename P04, typename P05,
373 typename P06, typename P07, typename P08, typename P09, typename P10,
374 typename P11, typename P12, typename P13, typename P14, typename P15,
375 typename P16, typename P17, typename P18>
376 struct IsFunctionPointerRaw<T( *)(
377 P01, P02, P03, P04, P05,
378 P06, P07, P08, P09, P10,
379 P11, P12, P13, P14, P15,
385 template <typename T,
386 typename P01, typename P02, typename P03, typename P04, typename P05,
387 typename P06, typename P07, typename P08, typename P09, typename P10,
388 typename P11, typename P12, typename P13, typename P14, typename P15,
389 typename P16, typename P17, typename P18, typename P19>
390 struct IsFunctionPointerRaw<T( *)(
391 P01, P02, P03, P04, P05,
392 P06, P07, P08, P09, P10,
393 P11, P12, P13, P14, P15,
399 template <typename T,
400 typename P01, typename P02, typename P03, typename P04, typename P05,
401 typename P06, typename P07, typename P08, typename P09, typename P10,
402 typename P11, typename P12, typename P13, typename P14, typename P15,
403 typename P16, typename P17, typename P18, typename P19, typename P20>
404 struct IsFunctionPointerRaw<T( *)(
405 P01, P02, P03, P04, P05,
406 P06, P07, P08, P09, P10,
407 P11, P12, P13, P14, P15,
408 P16, P17, P18, P19, P20)>
413 template <typename T>
414 struct IsFunctionPointerRaw<T( *)(
420 template <typename T,
422 struct IsFunctionPointerRaw<T( *)(
428 template <typename T,
429 typename P01, typename P02>
430 struct IsFunctionPointerRaw<T( *)(
436 template <typename T,
437 typename P01, typename P02, typename P03>
438 struct IsFunctionPointerRaw<T( *)(
444 template <typename T,
445 typename P01, typename P02, typename P03, typename P04>
446 struct IsFunctionPointerRaw<T( *)(
447 P01, P02, P03, P04, ...)>
452 template <typename T,
453 typename P01, typename P02, typename P03, typename P04, typename P05>
454 struct IsFunctionPointerRaw<T( *)(
455 P01, P02, P03, P04, P05,
461 template <typename T,
462 typename P01, typename P02, typename P03, typename P04, typename P05,
464 struct IsFunctionPointerRaw<T( *)(
465 P01, P02, P03, P04, P05,
471 template <typename T,
472 typename P01, typename P02, typename P03, typename P04, typename P05,
473 typename P06, typename P07>
474 struct IsFunctionPointerRaw<T( *)(
475 P01, P02, P03, P04, P05,
481 template <typename T,
482 typename P01, typename P02, typename P03, typename P04, typename P05,
483 typename P06, typename P07, typename P08>
484 struct IsFunctionPointerRaw<T( *)(
485 P01, P02, P03, P04, P05,
491 template <typename T,
492 typename P01, typename P02, typename P03, typename P04, typename P05,
493 typename P06, typename P07, typename P08, typename P09>
494 struct IsFunctionPointerRaw<T( *)(
495 P01, P02, P03, P04, P05,
496 P06, P07, P08, P09, ...)>
501 template <typename T,
502 typename P01, typename P02, typename P03, typename P04, typename P05,
503 typename P06, typename P07, typename P08, typename P09, typename P10>
504 struct IsFunctionPointerRaw<T( *)(
505 P01, P02, P03, P04, P05,
506 P06, P07, P08, P09, P10,
512 template <typename T,
513 typename P01, typename P02, typename P03, typename P04, typename P05,
514 typename P06, typename P07, typename P08, typename P09, typename P10,
516 struct IsFunctionPointerRaw<T( *)(
517 P01, P02, P03, P04, P05,
518 P06, P07, P08, P09, P10,
524 template <typename T,
525 typename P01, typename P02, typename P03, typename P04, typename P05,
526 typename P06, typename P07, typename P08, typename P09, typename P10,
527 typename P11, typename P12>
528 struct IsFunctionPointerRaw<T( *)(
529 P01, P02, P03, P04, P05,
530 P06, P07, P08, P09, P10,
536 template <typename T,
537 typename P01, typename P02, typename P03, typename P04, typename P05,
538 typename P06, typename P07, typename P08, typename P09, typename P10,
539 typename P11, typename P12, typename P13>
540 struct IsFunctionPointerRaw<T( *)(
541 P01, P02, P03, P04, P05,
542 P06, P07, P08, P09, P10,
548 template <typename T,
549 typename P01, typename P02, typename P03, typename P04, typename P05,
550 typename P06, typename P07, typename P08, typename P09, typename P10,
551 typename P11, typename P12, typename P13, typename P14>
552 struct IsFunctionPointerRaw<T( *)(
553 P01, P02, P03, P04, P05,
554 P06, P07, P08, P09, P10,
555 P11, P12, P13, P14, ...)>
560 template <typename T,
561 typename P01, typename P02, typename P03, typename P04, typename P05,
562 typename P06, typename P07, typename P08, typename P09, typename P10,
563 typename P11, typename P12, typename P13, typename P14, typename P15>
564 struct IsFunctionPointerRaw<T( *)(
565 P01, P02, P03, P04, P05,
566 P06, P07, P08, P09, P10,
567 P11, P12, P13, P14, P15,
573 template <typename T,
574 typename P01, typename P02, typename P03, typename P04, typename P05,
575 typename P06, typename P07, typename P08, typename P09, typename P10,
576 typename P11, typename P12, typename P13, typename P14, typename P15,
578 struct IsFunctionPointerRaw<T( *)(
579 P01, P02, P03, P04, P05,
580 P06, P07, P08, P09, P10,
581 P11, P12, P13, P14, P15,
587 template <typename T,
588 typename P01, typename P02, typename P03, typename P04, typename P05,
589 typename P06, typename P07, typename P08, typename P09, typename P10,
590 typename P11, typename P12, typename P13, typename P14, typename P15,
591 typename P16, typename P17>
592 struct IsFunctionPointerRaw<T( *)(
593 P01, P02, P03, P04, P05,
594 P06, P07, P08, P09, P10,
595 P11, P12, P13, P14, P15,
601 template <typename T,
602 typename P01, typename P02, typename P03, typename P04, typename P05,
603 typename P06, typename P07, typename P08, typename P09, typename P10,
604 typename P11, typename P12, typename P13, typename P14, typename P15,
605 typename P16, typename P17, typename P18>
606 struct IsFunctionPointerRaw<T( *)(
607 P01, P02, P03, P04, P05,
608 P06, P07, P08, P09, P10,
609 P11, P12, P13, P14, P15,
615 template <typename T,
616 typename P01, typename P02, typename P03, typename P04, typename P05,
617 typename P06, typename P07, typename P08, typename P09, typename P10,
618 typename P11, typename P12, typename P13, typename P14, typename P15,
619 typename P16, typename P17, typename P18, typename P19>
620 struct IsFunctionPointerRaw<T( *)(
621 P01, P02, P03, P04, P05,
622 P06, P07, P08, P09, P10,
623 P11, P12, P13, P14, P15,
624 P16, P17, P18, P19, ...)>
629 template <typename T,
630 typename P01, typename P02, typename P03, typename P04, typename P05,
631 typename P06, typename P07, typename P08, typename P09, typename P10,
632 typename P11, typename P12, typename P13, typename P14, typename P15,
633 typename P16, typename P17, typename P18, typename P19, typename P20>
634 struct IsFunctionPointerRaw<T( *)(
635 P01, P02, P03, P04, P05,
636 P06, P07, P08, P09, P10,
637 P11, P12, P13, P14, P15,
638 P16, P17, P18, P19, P20,
645 template <typename T>
646 struct IsMemberFunctionPointerRaw
651 template <typename T, typename S>
652 struct IsMemberFunctionPointerRaw<T (S:: *)()>
657 template <typename T, typename S,
659 struct IsMemberFunctionPointerRaw<T (S:: *)(P01)>
664 template <typename T, typename S,
665 typename P01, typename P02>
666 struct IsMemberFunctionPointerRaw<T (S:: *)(
672 template <typename T, typename S,
673 typename P01, typename P02, typename P03>
674 struct IsMemberFunctionPointerRaw<T (S:: *)(
680 template <typename T, typename S,
681 typename P01, typename P02, typename P03, typename P04>
682 struct IsMemberFunctionPointerRaw<T (S:: *)(
688 template <typename T, typename S,
689 typename P01, typename P02, typename P03, typename P04, typename P05>
690 struct IsMemberFunctionPointerRaw<T (S:: *)(
691 P01, P02, P03, P04, P05)>
696 template <typename T, typename S,
697 typename P01, typename P02, typename P03, typename P04, typename P05,
699 struct IsMemberFunctionPointerRaw<T (S:: *)(
700 P01, P02, P03, P04, P05,
706 template <typename T, typename S,
707 typename P01, typename P02, typename P03, typename P04, typename P05,
708 typename P06, typename P07>
709 struct IsMemberFunctionPointerRaw<T (S:: *)(
710 P01, P02, P03, P04, P05,
716 template <typename T, typename S,
717 typename P01, typename P02, typename P03, typename P04, typename P05,
718 typename P06, typename P07, typename P08>
719 struct IsMemberFunctionPointerRaw<T (S:: *)(
720 P01, P02, P03, P04, P05,
726 template <typename T, typename S,
727 typename P01, typename P02, typename P03, typename P04, typename P05,
728 typename P06, typename P07, typename P08, typename P09>
729 struct IsMemberFunctionPointerRaw<T (S:: *)(
730 P01, P02, P03, P04, P05,
736 template <typename T, typename S,
737 typename P01, typename P02, typename P03, typename P04, typename P05,
738 typename P06, typename P07, typename P08, typename P09, typename P10>
739 struct IsMemberFunctionPointerRaw<T (S:: *)(
740 P01, P02, P03, P04, P05,
741 P06, P07, P08, P09, P10)>
746 template <typename T, typename S,
747 typename P01, typename P02, typename P03, typename P04, typename P05,
748 typename P06, typename P07, typename P08, typename P09, typename P10,
750 struct IsMemberFunctionPointerRaw<T (S:: *)(
751 P01, P02, P03, P04, P05,
752 P06, P07, P08, P09, P10,
758 template <typename T, typename S,
759 typename P01, typename P02, typename P03, typename P04, typename P05,
760 typename P06, typename P07, typename P08, typename P09, typename P10,
761 typename P11, typename P12>
762 struct IsMemberFunctionPointerRaw<T (S:: *)(
763 P01, P02, P03, P04, P05,
764 P06, P07, P08, P09, P10,
770 template <typename T, typename S,
771 typename P01, typename P02, typename P03, typename P04, typename P05,
772 typename P06, typename P07, typename P08, typename P09, typename P10,
773 typename P11, typename P12, typename P13>
774 struct IsMemberFunctionPointerRaw<T (S:: *)(
775 P01, P02, P03, P04, P05,
776 P06, P07, P08, P09, P10,
782 template <typename T, typename S,
783 typename P01, typename P02, typename P03, typename P04, typename P05,
784 typename P06, typename P07, typename P08, typename P09, typename P10,
785 typename P11, typename P12, typename P13, typename P14>
786 struct IsMemberFunctionPointerRaw<T (S:: *)(
787 P01, P02, P03, P04, P05,
788 P06, P07, P08, P09, P10,
794 template <typename T, typename S,
795 typename P01, typename P02, typename P03, typename P04, typename P05,
796 typename P06, typename P07, typename P08, typename P09, typename P10,
797 typename P11, typename P12, typename P13, typename P14, typename P15>
798 struct IsMemberFunctionPointerRaw<T (S:: *)(
799 P01, P02, P03, P04, P05,
800 P06, P07, P08, P09, P10,
801 P11, P12, P13, P14, P15)>
806 template <typename T, typename S,
807 typename P01, typename P02, typename P03, typename P04, typename P05,
808 typename P06, typename P07, typename P08, typename P09, typename P10,
809 typename P11, typename P12, typename P13, typename P14, typename P15,
811 struct IsMemberFunctionPointerRaw<T (S:: *)(
812 P01, P02, P03, P04, P05,
813 P06, P07, P08, P09, P10,
814 P11, P12, P13, P14, P15,
820 template <typename T, typename S,
821 typename P01, typename P02, typename P03, typename P04, typename P05,
822 typename P06, typename P07, typename P08, typename P09, typename P10,
823 typename P11, typename P12, typename P13, typename P14, typename P15,
824 typename P16, typename P17>
825 struct IsMemberFunctionPointerRaw<T (S:: *)(
826 P01, P02, P03, P04, P05,
827 P06, P07, P08, P09, P10,
828 P11, P12, P13, P14, P15,
834 template <typename T, typename S,
835 typename P01, typename P02, typename P03, typename P04, typename P05,
836 typename P06, typename P07, typename P08, typename P09, typename P10,
837 typename P11, typename P12, typename P13, typename P14, typename P15,
838 typename P16, typename P17, typename P18>
839 struct IsMemberFunctionPointerRaw<T (S:: *)(
840 P01, P02, P03, P04, P05,
841 P06, P07, P08, P09, P10,
842 P11, P12, P13, P14, P15,
848 template <typename T, typename S,
849 typename P01, typename P02, typename P03, typename P04, typename P05,
850 typename P06, typename P07, typename P08, typename P09, typename P10,
851 typename P11, typename P12, typename P13, typename P14, typename P15,
852 typename P16, typename P17, typename P18, typename P19>
853 struct IsMemberFunctionPointerRaw<T (S:: *)(
854 P01, P02, P03, P04, P05,
855 P06, P07, P08, P09, P10,
856 P11, P12, P13, P14, P15,
862 template <typename T, typename S,
863 typename P01, typename P02, typename P03, typename P04, typename P05,
864 typename P06, typename P07, typename P08, typename P09, typename P10,
865 typename P11, typename P12, typename P13, typename P14, typename P15,
866 typename P16, typename P17, typename P18, typename P19, typename P20>
867 struct IsMemberFunctionPointerRaw<T (S:: *)(
868 P01, P02, P03, P04, P05,
869 P06, P07, P08, P09, P10,
870 P11, P12, P13, P14, P15,
871 P16, P17, P18, P19, P20)>
876 template <typename T, typename S>
877 struct IsMemberFunctionPointerRaw<T (S:: *)(
883 template <typename T, typename S,
885 struct IsMemberFunctionPointerRaw<T (S:: *)(
891 template <typename T, typename S,
892 typename P01, typename P02>
893 struct IsMemberFunctionPointerRaw<T (S:: *)(
899 template <typename T, typename S,
900 typename P01, typename P02, typename P03>
901 struct IsMemberFunctionPointerRaw<T (S:: *)(
907 template <typename T, typename S,
908 typename P01, typename P02, typename P03, typename P04>
909 struct IsMemberFunctionPointerRaw<T (S:: *)(
910 P01, P02, P03, P04, ...)>
915 template <typename T, typename S,
916 typename P01, typename P02, typename P03, typename P04, typename P05>
917 struct IsMemberFunctionPointerRaw<T (S:: *)(
918 P01, P02, P03, P04, P05,
924 template <typename T, typename S,
925 typename P01, typename P02, typename P03, typename P04, typename P05,
927 struct IsMemberFunctionPointerRaw<T (S:: *)(
928 P01, P02, P03, P04, P05,
934 template <typename T, typename S,
935 typename P01, typename P02, typename P03, typename P04, typename P05,
936 typename P06, typename P07>
937 struct IsMemberFunctionPointerRaw<T (S:: *)(
938 P01, P02, P03, P04, P05,
944 template <typename T, typename S,
945 typename P01, typename P02, typename P03, typename P04, typename P05,
946 typename P06, typename P07, typename P08>
947 struct IsMemberFunctionPointerRaw<T (S:: *)(
948 P01, P02, P03, P04, P05,
954 template <typename T, typename S,
955 typename P01, typename P02, typename P03, typename P04, typename P05,
956 typename P06, typename P07, typename P08, typename P09>
957 struct IsMemberFunctionPointerRaw<T (S:: *)(
958 P01, P02, P03, P04, P05,
959 P06, P07, P08, P09, ...)>
964 template <typename T, typename S,
965 typename P01, typename P02, typename P03, typename P04, typename P05,
966 typename P06, typename P07, typename P08, typename P09, typename P10>
967 struct IsMemberFunctionPointerRaw<T (S:: *)(
968 P01, P02, P03, P04, P05,
969 P06, P07, P08, P09, P10,
975 template <typename T, typename S,
976 typename P01, typename P02, typename P03, typename P04, typename P05,
977 typename P06, typename P07, typename P08, typename P09, typename P10,
979 struct IsMemberFunctionPointerRaw<T (S:: *)(
980 P01, P02, P03, P04, P05,
981 P06, P07, P08, P09, P10,
987 template <typename T, typename S,
988 typename P01, typename P02, typename P03, typename P04, typename P05,
989 typename P06, typename P07, typename P08, typename P09, typename P10,
990 typename P11, typename P12>
991 struct IsMemberFunctionPointerRaw<T (S:: *)(
992 P01, P02, P03, P04, P05,
993 P06, P07, P08, P09, P10,
999 template <typename T, typename S,
1000 typename P01, typename P02, typename P03, typename P04, typename P05,
1001 typename P06, typename P07, typename P08, typename P09, typename P10,
1002 typename P11, typename P12, typename P13>
1003 struct IsMemberFunctionPointerRaw<T (S:: *)(
1004 P01, P02, P03, P04, P05,
1005 P06, P07, P08, P09, P10,
1006 P11, P12, P13, ...)>
1011 template <typename T, typename S,
1012 typename P01, typename P02, typename P03, typename P04, typename P05,
1013 typename P06, typename P07, typename P08, typename P09, typename P10,
1014 typename P11, typename P12, typename P13, typename P14>
1015 struct IsMemberFunctionPointerRaw<T (S:: *)(
1016 P01, P02, P03, P04, P05,
1017 P06, P07, P08, P09, P10,
1018 P11, P12, P13, P14, ...)>
1023 template <typename T, typename S,
1024 typename P01, typename P02, typename P03, typename P04, typename P05,
1025 typename P06, typename P07, typename P08, typename P09, typename P10,
1026 typename P11, typename P12, typename P13, typename P14, typename P15>
1027 struct IsMemberFunctionPointerRaw<T (S:: *)(
1028 P01, P02, P03, P04, P05,
1029 P06, P07, P08, P09, P10,
1030 P11, P12, P13, P14, P15,
1036 template <typename T, typename S,
1037 typename P01, typename P02, typename P03, typename P04, typename P05,
1038 typename P06, typename P07, typename P08, typename P09, typename P10,
1039 typename P11, typename P12, typename P13, typename P14, typename P15,
1041 struct IsMemberFunctionPointerRaw<T (S:: *)(
1042 P01, P02, P03, P04, P05,
1043 P06, P07, P08, P09, P10,
1044 P11, P12, P13, P14, P15,
1050 template <typename T, typename S,
1051 typename P01, typename P02, typename P03, typename P04, typename P05,
1052 typename P06, typename P07, typename P08, typename P09, typename P10,
1053 typename P11, typename P12, typename P13, typename P14, typename P15,
1054 typename P16, typename P17>
1055 struct IsMemberFunctionPointerRaw<T (S:: *)(
1056 P01, P02, P03, P04, P05,
1057 P06, P07, P08, P09, P10,
1058 P11, P12, P13, P14, P15,
1064 template <typename T, typename S,
1065 typename P01, typename P02, typename P03, typename P04, typename P05,
1066 typename P06, typename P07, typename P08, typename P09, typename P10,
1067 typename P11, typename P12, typename P13, typename P14, typename P15,
1068 typename P16, typename P17, typename P18>
1069 struct IsMemberFunctionPointerRaw<T (S:: *)(
1070 P01, P02, P03, P04, P05,
1071 P06, P07, P08, P09, P10,
1072 P11, P12, P13, P14, P15,
1073 P16, P17, P18, ...)>
1078 template <typename T, typename S,
1079 typename P01, typename P02, typename P03, typename P04, typename P05,
1080 typename P06, typename P07, typename P08, typename P09, typename P10,
1081 typename P11, typename P12, typename P13, typename P14, typename P15,
1082 typename P16, typename P17, typename P18, typename P19>
1083 struct IsMemberFunctionPointerRaw<T (S:: *)(
1084 P01, P02, P03, P04, P05,
1085 P06, P07, P08, P09, P10,
1086 P11, P12, P13, P14, P15,
1087 P16, P17, P18, P19, ...)>
1092 template <typename T, typename S,
1093 typename P01, typename P02, typename P03, typename P04, typename P05,
1094 typename P06, typename P07, typename P08, typename P09, typename P10,
1095 typename P11, typename P12, typename P13, typename P14, typename P15,
1096 typename P16, typename P17, typename P18, typename P19, typename P20>
1097 struct IsMemberFunctionPointerRaw<T (S:: *)(
1098 P01, P02, P03, P04, P05,
1099 P06, P07, P08, P09, P10,
1100 P11, P12, P13, P14, P15,
1101 P16, P17, P18, P19, P20,
1109 template <typename T, typename S>
1110 struct IsMemberFunctionPointerRaw<T (S:: *)() const>
1115 template <typename T, typename S,
1117 struct IsMemberFunctionPointerRaw<T (S:: *)(P01) const>
1122 template <typename T, typename S,
1123 typename P01, typename P02>
1124 struct IsMemberFunctionPointerRaw<T (S:: *)(
1130 template <typename T, typename S,
1131 typename P01, typename P02, typename P03>
1132 struct IsMemberFunctionPointerRaw<T (S:: *)(
1133 P01, P02, P03) const>
1138 template <typename T, typename S,
1139 typename P01, typename P02, typename P03, typename P04>
1140 struct IsMemberFunctionPointerRaw<T (S:: *)(
1141 P01, P02, P03, P04) const>
1146 template <typename T, typename S,
1147 typename P01, typename P02, typename P03, typename P04, typename P05>
1148 struct IsMemberFunctionPointerRaw<T (S:: *)(
1149 P01, P02, P03, P04, P05) const>
1154 template <typename T, typename S,
1155 typename P01, typename P02, typename P03, typename P04, typename P05,
1157 struct IsMemberFunctionPointerRaw<T (S:: *)(
1158 P01, P02, P03, P04, P05,
1164 template <typename T, typename S,
1165 typename P01, typename P02, typename P03, typename P04, typename P05,
1166 typename P06, typename P07>
1167 struct IsMemberFunctionPointerRaw<T (S:: *)(
1168 P01, P02, P03, P04, P05,
1174 template <typename T, typename S,
1175 typename P01, typename P02, typename P03, typename P04, typename P05,
1176 typename P06, typename P07, typename P08>
1177 struct IsMemberFunctionPointerRaw<T (S:: *)(
1178 P01, P02, P03, P04, P05,
1179 P06, P07, P08) const>
1184 template <typename T, typename S,
1185 typename P01, typename P02, typename P03, typename P04, typename P05,
1186 typename P06, typename P07, typename P08, typename P09>
1187 struct IsMemberFunctionPointerRaw<T (S:: *)(
1188 P01, P02, P03, P04, P05,
1189 P06, P07, P08, P09) const>
1194 template <typename T, typename S,
1195 typename P01, typename P02, typename P03, typename P04, typename P05,
1196 typename P06, typename P07, typename P08, typename P09, typename P10>
1197 struct IsMemberFunctionPointerRaw<T (S:: *)(
1198 P01, P02, P03, P04, P05,
1199 P06, P07, P08, P09, P10) const>
1204 template <typename T, typename S,
1205 typename P01, typename P02, typename P03, typename P04, typename P05,
1206 typename P06, typename P07, typename P08, typename P09, typename P10,
1208 struct IsMemberFunctionPointerRaw<T (S:: *)(
1209 P01, P02, P03, P04, P05,
1210 P06, P07, P08, P09, P10,
1216 template <typename T, typename S,
1217 typename P01, typename P02, typename P03, typename P04, typename P05,
1218 typename P06, typename P07, typename P08, typename P09, typename P10,
1219 typename P11, typename P12>
1220 struct IsMemberFunctionPointerRaw<T (S:: *)(
1221 P01, P02, P03, P04, P05,
1222 P06, P07, P08, P09, P10,
1228 template <typename T, typename S,
1229 typename P01, typename P02, typename P03, typename P04, typename P05,
1230 typename P06, typename P07, typename P08, typename P09, typename P10,
1231 typename P11, typename P12, typename P13>
1232 struct IsMemberFunctionPointerRaw<T (S:: *)(
1233 P01, P02, P03, P04, P05,
1234 P06, P07, P08, P09, P10,
1235 P11, P12, P13) const>
1240 template <typename T, typename S,
1241 typename P01, typename P02, typename P03, typename P04, typename P05,
1242 typename P06, typename P07, typename P08, typename P09, typename P10,
1243 typename P11, typename P12, typename P13, typename P14>
1244 struct IsMemberFunctionPointerRaw<T (S:: *)(
1245 P01, P02, P03, P04, P05,
1246 P06, P07, P08, P09, P10,
1247 P11, P12, P13, P14) const>
1252 template <typename T, typename S,
1253 typename P01, typename P02, typename P03, typename P04, typename P05,
1254 typename P06, typename P07, typename P08, typename P09, typename P10,
1255 typename P11, typename P12, typename P13, typename P14, typename P15>
1256 struct IsMemberFunctionPointerRaw<T (S:: *)(
1257 P01, P02, P03, P04, P05,
1258 P06, P07, P08, P09, P10,
1259 P11, P12, P13, P14, P15) const>
1264 template <typename T, typename S,
1265 typename P01, typename P02, typename P03, typename P04, typename P05,
1266 typename P06, typename P07, typename P08, typename P09, typename P10,
1267 typename P11, typename P12, typename P13, typename P14, typename P15,
1269 struct IsMemberFunctionPointerRaw<T (S:: *)(
1270 P01, P02, P03, P04, P05,
1271 P06, P07, P08, P09, P10,
1272 P11, P12, P13, P14, P15,
1278 template <typename T, typename S,
1279 typename P01, typename P02, typename P03, typename P04, typename P05,
1280 typename P06, typename P07, typename P08, typename P09, typename P10,
1281 typename P11, typename P12, typename P13, typename P14, typename P15,
1282 typename P16, typename P17>
1283 struct IsMemberFunctionPointerRaw<T (S:: *)(
1284 P01, P02, P03, P04, P05,
1285 P06, P07, P08, P09, P10,
1286 P11, P12, P13, P14, P15,
1292 template <typename T, typename S,
1293 typename P01, typename P02, typename P03, typename P04, typename P05,
1294 typename P06, typename P07, typename P08, typename P09, typename P10,
1295 typename P11, typename P12, typename P13, typename P14, typename P15,
1296 typename P16, typename P17, typename P18>
1297 struct IsMemberFunctionPointerRaw<T (S:: *)(
1298 P01, P02, P03, P04, P05,
1299 P06, P07, P08, P09, P10,
1300 P11, P12, P13, P14, P15,
1301 P16, P17, P18) const>
1306 template <typename T, typename S,
1307 typename P01, typename P02, typename P03, typename P04, typename P05,
1308 typename P06, typename P07, typename P08, typename P09, typename P10,
1309 typename P11, typename P12, typename P13, typename P14, typename P15,
1310 typename P16, typename P17, typename P18, typename P19>
1311 struct IsMemberFunctionPointerRaw<T (S:: *)(
1312 P01, P02, P03, P04, P05,
1313 P06, P07, P08, P09, P10,
1314 P11, P12, P13, P14, P15,
1315 P16, P17, P18, P19) const>
1320 template <typename T, typename S,
1321 typename P01, typename P02, typename P03, typename P04, typename P05,
1322 typename P06, typename P07, typename P08, typename P09, typename P10,
1323 typename P11, typename P12, typename P13, typename P14, typename P15,
1324 typename P16, typename P17, typename P18, typename P19, typename P20>
1325 struct IsMemberFunctionPointerRaw<T (S:: *)(
1326 P01, P02, P03, P04, P05,
1327 P06, P07, P08, P09, P10,
1328 P11, P12, P13, P14, P15,
1329 P16, P17, P18, P19, P20) const>
1334 template <typename T, typename S>
1335 struct IsMemberFunctionPointerRaw<T (S:: *)(
1341 template <typename T, typename S,
1343 struct IsMemberFunctionPointerRaw<T (S:: *)(
1349 template <typename T, typename S,
1350 typename P01, typename P02>
1351 struct IsMemberFunctionPointerRaw<T (S:: *)(
1352 P01, P02, ...) const>
1357 template <typename T, typename S,
1358 typename P01, typename P02, typename P03>
1359 struct IsMemberFunctionPointerRaw<T (S:: *)(
1360 P01, P02, P03, ...) const>
1365 template <typename T, typename S,
1366 typename P01, typename P02, typename P03, typename P04>
1367 struct IsMemberFunctionPointerRaw<T (S:: *)(
1368 P01, P02, P03, P04, ...) const>
1373 template <typename T, typename S,
1374 typename P01, typename P02, typename P03, typename P04, typename P05>
1375 struct IsMemberFunctionPointerRaw<T (S:: *)(
1376 P01, P02, P03, P04, P05,
1382 template <typename T, typename S,
1383 typename P01, typename P02, typename P03, typename P04, typename P05,
1385 struct IsMemberFunctionPointerRaw<T (S:: *)(
1386 P01, P02, P03, P04, P05,
1392 template <typename T, typename S,
1393 typename P01, typename P02, typename P03, typename P04, typename P05,
1394 typename P06, typename P07>
1395 struct IsMemberFunctionPointerRaw<T (S:: *)(
1396 P01, P02, P03, P04, P05,
1397 P06, P07, ...) const>
1402 template <typename T, typename S,
1403 typename P01, typename P02, typename P03, typename P04, typename P05,
1404 typename P06, typename P07, typename P08>
1405 struct IsMemberFunctionPointerRaw<T (S:: *)(
1406 P01, P02, P03, P04, P05,
1407 P06, P07, P08, ...) const>
1412 template <typename T, typename S,
1413 typename P01, typename P02, typename P03, typename P04, typename P05,
1414 typename P06, typename P07, typename P08, typename P09>
1415 struct IsMemberFunctionPointerRaw<T (S:: *)(
1416 P01, P02, P03, P04, P05,
1417 P06, P07, P08, P09, ...) const>
1422 template <typename T, typename S,
1423 typename P01, typename P02, typename P03, typename P04, typename P05,
1424 typename P06, typename P07, typename P08, typename P09, typename P10>
1425 struct IsMemberFunctionPointerRaw<T (S:: *)(
1426 P01, P02, P03, P04, P05,
1427 P06, P07, P08, P09, P10,
1433 template <typename T, typename S,
1434 typename P01, typename P02, typename P03, typename P04, typename P05,
1435 typename P06, typename P07, typename P08, typename P09, typename P10,
1437 struct IsMemberFunctionPointerRaw<T (S:: *)(
1438 P01, P02, P03, P04, P05,
1439 P06, P07, P08, P09, P10,
1445 template <typename T, typename S,
1446 typename P01, typename P02, typename P03, typename P04, typename P05,
1447 typename P06, typename P07, typename P08, typename P09, typename P10,
1448 typename P11, typename P12>
1449 struct IsMemberFunctionPointerRaw<T (S:: *)(
1450 P01, P02, P03, P04, P05,
1451 P06, P07, P08, P09, P10,
1452 P11, P12, ...) const>
1457 template <typename T, typename S,
1458 typename P01, typename P02, typename P03, typename P04, typename P05,
1459 typename P06, typename P07, typename P08, typename P09, typename P10,
1460 typename P11, typename P12, typename P13>
1461 struct IsMemberFunctionPointerRaw<T (S:: *)(
1462 P01, P02, P03, P04, P05,
1463 P06, P07, P08, P09, P10,
1464 P11, P12, P13, ...) const>
1469 template <typename T, typename S,
1470 typename P01, typename P02, typename P03, typename P04, typename P05,
1471 typename P06, typename P07, typename P08, typename P09, typename P10,
1472 typename P11, typename P12, typename P13, typename P14>
1473 struct IsMemberFunctionPointerRaw<T (S:: *)(
1474 P01, P02, P03, P04, P05,
1475 P06, P07, P08, P09, P10,
1476 P11, P12, P13, P14, ...) const>
1481 template <typename T, typename S,
1482 typename P01, typename P02, typename P03, typename P04, typename P05,
1483 typename P06, typename P07, typename P08, typename P09, typename P10,
1484 typename P11, typename P12, typename P13, typename P14, typename P15>
1485 struct IsMemberFunctionPointerRaw<T (S:: *)(
1486 P01, P02, P03, P04, P05,
1487 P06, P07, P08, P09, P10,
1488 P11, P12, P13, P14, P15,
1494 template <typename T, typename S,
1495 typename P01, typename P02, typename P03, typename P04, typename P05,
1496 typename P06, typename P07, typename P08, typename P09, typename P10,
1497 typename P11, typename P12, typename P13, typename P14, typename P15,
1499 struct IsMemberFunctionPointerRaw<T (S:: *)(
1500 P01, P02, P03, P04, P05,
1501 P06, P07, P08, P09, P10,
1502 P11, P12, P13, P14, P15,
1508 template <typename T, typename S,
1509 typename P01, typename P02, typename P03, typename P04, typename P05,
1510 typename P06, typename P07, typename P08, typename P09, typename P10,
1511 typename P11, typename P12, typename P13, typename P14, typename P15,
1512 typename P16, typename P17>
1513 struct IsMemberFunctionPointerRaw<T (S:: *)(
1514 P01, P02, P03, P04, P05,
1515 P06, P07, P08, P09, P10,
1516 P11, P12, P13, P14, P15,
1517 P16, P17, ...) const>
1522 template <typename T, typename S,
1523 typename P01, typename P02, typename P03, typename P04, typename P05,
1524 typename P06, typename P07, typename P08, typename P09, typename P10,
1525 typename P11, typename P12, typename P13, typename P14, typename P15,
1526 typename P16, typename P17, typename P18>
1527 struct IsMemberFunctionPointerRaw<T (S:: *)(
1528 P01, P02, P03, P04, P05,
1529 P06, P07, P08, P09, P10,
1530 P11, P12, P13, P14, P15,
1531 P16, P17, P18, ...) const>
1536 template <typename T, typename S,
1537 typename P01, typename P02, typename P03, typename P04, typename P05,
1538 typename P06, typename P07, typename P08, typename P09, typename P10,
1539 typename P11, typename P12, typename P13, typename P14, typename P15,
1540 typename P16, typename P17, typename P18, typename P19>
1541 struct IsMemberFunctionPointerRaw<T (S:: *)(
1542 P01, P02, P03, P04, P05,
1543 P06, P07, P08, P09, P10,
1544 P11, P12, P13, P14, P15,
1545 P16, P17, P18, P19, ...) const>
1550 template <typename T, typename S,
1551 typename P01, typename P02, typename P03, typename P04, typename P05,
1552 typename P06, typename P07, typename P08, typename P09, typename P10,
1553 typename P11, typename P12, typename P13, typename P14, typename P15,
1554 typename P16, typename P17, typename P18, typename P19, typename P20>
1555 struct IsMemberFunctionPointerRaw<T (S:: *)(
1556 P01, P02, P03, P04, P05,
1557 P06, P07, P08, P09, P10,
1558 P11, P12, P13, P14, P15,
1559 P16, P17, P18, P19, P20,
1565 // Volatile versions
1567 template <typename T, typename S>
1568 struct IsMemberFunctionPointerRaw<T (S:: *)() volatile>
1573 template <typename T, typename S,
1575 struct IsMemberFunctionPointerRaw<T (S:: *)(P01) volatile>
1580 template <typename T, typename S,
1581 typename P01, typename P02>
1582 struct IsMemberFunctionPointerRaw<T (S:: *)(
1588 template <typename T, typename S,
1589 typename P01, typename P02, typename P03>
1590 struct IsMemberFunctionPointerRaw<T (S:: *)(
1591 P01, P02, P03) volatile>
1596 template <typename T, typename S,
1597 typename P01, typename P02, typename P03, typename P04>
1598 struct IsMemberFunctionPointerRaw<T (S:: *)(
1599 P01, P02, P03, P04) volatile>
1604 template <typename T, typename S,
1605 typename P01, typename P02, typename P03, typename P04, typename P05>
1606 struct IsMemberFunctionPointerRaw<T (S:: *)(
1607 P01, P02, P03, P04, P05) volatile>
1612 template <typename T, typename S,
1613 typename P01, typename P02, typename P03, typename P04, typename P05,
1615 struct IsMemberFunctionPointerRaw<T (S:: *)(
1616 P01, P02, P03, P04, P05,
1622 template <typename T, typename S,
1623 typename P01, typename P02, typename P03, typename P04, typename P05,
1624 typename P06, typename P07>
1625 struct IsMemberFunctionPointerRaw<T (S:: *)(
1626 P01, P02, P03, P04, P05,
1632 template <typename T, typename S,
1633 typename P01, typename P02, typename P03, typename P04, typename P05,
1634 typename P06, typename P07, typename P08>
1635 struct IsMemberFunctionPointerRaw<T (S:: *)(
1636 P01, P02, P03, P04, P05,
1637 P06, P07, P08) volatile>
1642 template <typename T, typename S,
1643 typename P01, typename P02, typename P03, typename P04, typename P05,
1644 typename P06, typename P07, typename P08, typename P09>
1645 struct IsMemberFunctionPointerRaw<T (S:: *)(
1646 P01, P02, P03, P04, P05,
1647 P06, P07, P08, P09) volatile>
1652 template <typename T, typename S,
1653 typename P01, typename P02, typename P03, typename P04, typename P05,
1654 typename P06, typename P07, typename P08, typename P09, typename P10>
1655 struct IsMemberFunctionPointerRaw<T (S:: *)(
1656 P01, P02, P03, P04, P05,
1657 P06, P07, P08, P09, P10) volatile>
1662 template <typename T, typename S,
1663 typename P01, typename P02, typename P03, typename P04, typename P05,
1664 typename P06, typename P07, typename P08, typename P09, typename P10,
1666 struct IsMemberFunctionPointerRaw<T (S:: *)(
1667 P01, P02, P03, P04, P05,
1668 P06, P07, P08, P09, P10,
1674 template <typename T, typename S,
1675 typename P01, typename P02, typename P03, typename P04, typename P05,
1676 typename P06, typename P07, typename P08, typename P09, typename P10,
1677 typename P11, typename P12>
1678 struct IsMemberFunctionPointerRaw<T (S:: *)(
1679 P01, P02, P03, P04, P05,
1680 P06, P07, P08, P09, P10,
1686 template <typename T, typename S,
1687 typename P01, typename P02, typename P03, typename P04, typename P05,
1688 typename P06, typename P07, typename P08, typename P09, typename P10,
1689 typename P11, typename P12, typename P13>
1690 struct IsMemberFunctionPointerRaw<T (S:: *)(
1691 P01, P02, P03, P04, P05,
1692 P06, P07, P08, P09, P10,
1693 P11, P12, P13) volatile>
1698 template <typename T, typename S,
1699 typename P01, typename P02, typename P03, typename P04, typename P05,
1700 typename P06, typename P07, typename P08, typename P09, typename P10,
1701 typename P11, typename P12, typename P13, typename P14>
1702 struct IsMemberFunctionPointerRaw<T (S:: *)(
1703 P01, P02, P03, P04, P05,
1704 P06, P07, P08, P09, P10,
1705 P11, P12, P13, P14) volatile>
1710 template <typename T, typename S,
1711 typename P01, typename P02, typename P03, typename P04, typename P05,
1712 typename P06, typename P07, typename P08, typename P09, typename P10,
1713 typename P11, typename P12, typename P13, typename P14, typename P15>
1714 struct IsMemberFunctionPointerRaw<T (S:: *)(
1715 P01, P02, P03, P04, P05,
1716 P06, P07, P08, P09, P10,
1717 P11, P12, P13, P14, P15) volatile>
1722 template <typename T, typename S,
1723 typename P01, typename P02, typename P03, typename P04, typename P05,
1724 typename P06, typename P07, typename P08, typename P09, typename P10,
1725 typename P11, typename P12, typename P13, typename P14, typename P15,
1727 struct IsMemberFunctionPointerRaw<T (S:: *)(
1728 P01, P02, P03, P04, P05,
1729 P06, P07, P08, P09, P10,
1730 P11, P12, P13, P14, P15,
1736 template <typename T, typename S,
1737 typename P01, typename P02, typename P03, typename P04, typename P05,
1738 typename P06, typename P07, typename P08, typename P09, typename P10,
1739 typename P11, typename P12, typename P13, typename P14, typename P15,
1740 typename P16, typename P17>
1741 struct IsMemberFunctionPointerRaw<T (S:: *)(
1742 P01, P02, P03, P04, P05,
1743 P06, P07, P08, P09, P10,
1744 P11, P12, P13, P14, P15,
1750 template <typename T, typename S,
1751 typename P01, typename P02, typename P03, typename P04, typename P05,
1752 typename P06, typename P07, typename P08, typename P09, typename P10,
1753 typename P11, typename P12, typename P13, typename P14, typename P15,
1754 typename P16, typename P17, typename P18>
1755 struct IsMemberFunctionPointerRaw<T (S:: *)(
1756 P01, P02, P03, P04, P05,
1757 P06, P07, P08, P09, P10,
1758 P11, P12, P13, P14, P15,
1759 P16, P17, P18) volatile>
1764 template <typename T, typename S,
1765 typename P01, typename P02, typename P03, typename P04, typename P05,
1766 typename P06, typename P07, typename P08, typename P09, typename P10,
1767 typename P11, typename P12, typename P13, typename P14, typename P15,
1768 typename P16, typename P17, typename P18, typename P19>
1769 struct IsMemberFunctionPointerRaw<T (S:: *)(
1770 P01, P02, P03, P04, P05,
1771 P06, P07, P08, P09, P10,
1772 P11, P12, P13, P14, P15,
1773 P16, P17, P18, P19) volatile>
1778 template <typename T, typename S,
1779 typename P01, typename P02, typename P03, typename P04, typename P05,
1780 typename P06, typename P07, typename P08, typename P09, typename P10,
1781 typename P11, typename P12, typename P13, typename P14, typename P15,
1782 typename P16, typename P17, typename P18, typename P19, typename P20>
1783 struct IsMemberFunctionPointerRaw<T (S:: *)(
1784 P01, P02, P03, P04, P05,
1785 P06, P07, P08, P09, P10,
1786 P11, P12, P13, P14, P15,
1787 P16, P17, P18, P19, P20) volatile>
1792 template <typename T, typename S>
1793 struct IsMemberFunctionPointerRaw<T (S:: *)(
1799 template <typename T, typename S,
1801 struct IsMemberFunctionPointerRaw<T (S:: *)(
1807 template <typename T, typename S,
1808 typename P01, typename P02>
1809 struct IsMemberFunctionPointerRaw<T (S:: *)(
1810 P01, P02, ...) volatile>
1815 template <typename T, typename S,
1816 typename P01, typename P02, typename P03>
1817 struct IsMemberFunctionPointerRaw<T (S:: *)(
1818 P01, P02, P03, ...) volatile>
1823 template <typename T, typename S,
1824 typename P01, typename P02, typename P03, typename P04>
1825 struct IsMemberFunctionPointerRaw<T (S:: *)(
1826 P01, P02, P03, P04, ...) volatile>
1831 template <typename T, typename S,
1832 typename P01, typename P02, typename P03, typename P04, typename P05>
1833 struct IsMemberFunctionPointerRaw<T (S:: *)(
1834 P01, P02, P03, P04, P05,
1840 template <typename T, typename S,
1841 typename P01, typename P02, typename P03, typename P04, typename P05,
1843 struct IsMemberFunctionPointerRaw<T (S:: *)(
1844 P01, P02, P03, P04, P05,
1850 template <typename T, typename S,
1851 typename P01, typename P02, typename P03, typename P04, typename P05,
1852 typename P06, typename P07>
1853 struct IsMemberFunctionPointerRaw<T (S:: *)(
1854 P01, P02, P03, P04, P05,
1855 P06, P07, ...) volatile>
1860 template <typename T, typename S,
1861 typename P01, typename P02, typename P03, typename P04, typename P05,
1862 typename P06, typename P07, typename P08>
1863 struct IsMemberFunctionPointerRaw<T (S:: *)(
1864 P01, P02, P03, P04, P05,
1865 P06, P07, P08, ...) volatile>
1870 template <typename T, typename S,
1871 typename P01, typename P02, typename P03, typename P04, typename P05,
1872 typename P06, typename P07, typename P08, typename P09>
1873 struct IsMemberFunctionPointerRaw<T (S:: *)(
1874 P01, P02, P03, P04, P05,
1875 P06, P07, P08, P09, ...) volatile>
1880 template <typename T, typename S,
1881 typename P01, typename P02, typename P03, typename P04, typename P05,
1882 typename P06, typename P07, typename P08, typename P09, typename P10>
1883 struct IsMemberFunctionPointerRaw<T (S:: *)(
1884 P01, P02, P03, P04, P05,
1885 P06, P07, P08, P09, P10,
1891 template <typename T, typename S,
1892 typename P01, typename P02, typename P03, typename P04, typename P05,
1893 typename P06, typename P07, typename P08, typename P09, typename P10,
1895 struct IsMemberFunctionPointerRaw<T (S:: *)(
1896 P01, P02, P03, P04, P05,
1897 P06, P07, P08, P09, P10,
1903 template <typename T, typename S,
1904 typename P01, typename P02, typename P03, typename P04, typename P05,
1905 typename P06, typename P07, typename P08, typename P09, typename P10,
1906 typename P11, typename P12>
1907 struct IsMemberFunctionPointerRaw<T (S:: *)(
1908 P01, P02, P03, P04, P05,
1909 P06, P07, P08, P09, P10,
1910 P11, P12, ...) volatile>
1915 template <typename T, typename S,
1916 typename P01, typename P02, typename P03, typename P04, typename P05,
1917 typename P06, typename P07, typename P08, typename P09, typename P10,
1918 typename P11, typename P12, typename P13>
1919 struct IsMemberFunctionPointerRaw<T (S:: *)(
1920 P01, P02, P03, P04, P05,
1921 P06, P07, P08, P09, P10,
1922 P11, P12, P13, ...) volatile>
1927 template <typename T, typename S,
1928 typename P01, typename P02, typename P03, typename P04, typename P05,
1929 typename P06, typename P07, typename P08, typename P09, typename P10,
1930 typename P11, typename P12, typename P13, typename P14>
1931 struct IsMemberFunctionPointerRaw<T (S:: *)(
1932 P01, P02, P03, P04, P05,
1933 P06, P07, P08, P09, P10,
1934 P11, P12, P13, P14, ...) volatile>
1939 template <typename T, typename S,
1940 typename P01, typename P02, typename P03, typename P04, typename P05,
1941 typename P06, typename P07, typename P08, typename P09, typename P10,
1942 typename P11, typename P12, typename P13, typename P14, typename P15>
1943 struct IsMemberFunctionPointerRaw<T (S:: *)(
1944 P01, P02, P03, P04, P05,
1945 P06, P07, P08, P09, P10,
1946 P11, P12, P13, P14, P15,
1952 template <typename T, typename S,
1953 typename P01, typename P02, typename P03, typename P04, typename P05,
1954 typename P06, typename P07, typename P08, typename P09, typename P10,
1955 typename P11, typename P12, typename P13, typename P14, typename P15,
1957 struct IsMemberFunctionPointerRaw<T (S:: *)(
1958 P01, P02, P03, P04, P05,
1959 P06, P07, P08, P09, P10,
1960 P11, P12, P13, P14, P15,
1966 template <typename T, typename S,
1967 typename P01, typename P02, typename P03, typename P04, typename P05,
1968 typename P06, typename P07, typename P08, typename P09, typename P10,
1969 typename P11, typename P12, typename P13, typename P14, typename P15,
1970 typename P16, typename P17>
1971 struct IsMemberFunctionPointerRaw<T (S:: *)(
1972 P01, P02, P03, P04, P05,
1973 P06, P07, P08, P09, P10,
1974 P11, P12, P13, P14, P15,
1975 P16, P17, ...) volatile>
1980 template <typename T, typename S,
1981 typename P01, typename P02, typename P03, typename P04, typename P05,
1982 typename P06, typename P07, typename P08, typename P09, typename P10,
1983 typename P11, typename P12, typename P13, typename P14, typename P15,
1984 typename P16, typename P17, typename P18>
1985 struct IsMemberFunctionPointerRaw<T (S:: *)(
1986 P01, P02, P03, P04, P05,
1987 P06, P07, P08, P09, P10,
1988 P11, P12, P13, P14, P15,
1989 P16, P17, P18, ...) volatile>
1994 template <typename T, typename S,
1995 typename P01, typename P02, typename P03, typename P04, typename P05,
1996 typename P06, typename P07, typename P08, typename P09, typename P10,
1997 typename P11, typename P12, typename P13, typename P14, typename P15,
1998 typename P16, typename P17, typename P18, typename P19>
1999 struct IsMemberFunctionPointerRaw<T (S:: *)(
2000 P01, P02, P03, P04, P05,
2001 P06, P07, P08, P09, P10,
2002 P11, P12, P13, P14, P15,
2003 P16, P17, P18, P19, ...) volatile>
2008 template <typename T, typename S,
2009 typename P01, typename P02, typename P03, typename P04, typename P05,
2010 typename P06, typename P07, typename P08, typename P09, typename P10,
2011 typename P11, typename P12, typename P13, typename P14, typename P15,
2012 typename P16, typename P17, typename P18, typename P19, typename P20>
2013 struct IsMemberFunctionPointerRaw<T (S:: *)(
2014 P01, P02, P03, P04, P05,
2015 P06, P07, P08, P09, P10,
2016 P11, P12, P13, P14, P15,
2017 P16, P17, P18, P19, P20,
2023 // Const volatile versions
2025 template <typename T, typename S>
2026 struct IsMemberFunctionPointerRaw<T (S:: *)() const volatile>
2031 template <typename T, typename S,
2033 struct IsMemberFunctionPointerRaw<T (S:: *)(P01) const volatile>
2038 template <typename T, typename S,
2039 typename P01, typename P02>
2040 struct IsMemberFunctionPointerRaw<T (S:: *)(
2041 P01, P02) const volatile>
2046 template <typename T, typename S,
2047 typename P01, typename P02, typename P03>
2048 struct IsMemberFunctionPointerRaw<T (S:: *)(
2049 P01, P02, P03) const volatile>
2054 template <typename T, typename S,
2055 typename P01, typename P02, typename P03, typename P04>
2056 struct IsMemberFunctionPointerRaw<T (S:: *)(
2057 P01, P02, P03, P04) const volatile>
2062 template <typename T, typename S,
2063 typename P01, typename P02, typename P03, typename P04, typename P05>
2064 struct IsMemberFunctionPointerRaw<T (S:: *)(
2065 P01, P02, P03, P04, P05) const volatile>
2070 template <typename T, typename S,
2071 typename P01, typename P02, typename P03, typename P04, typename P05,
2073 struct IsMemberFunctionPointerRaw<T (S:: *)(
2074 P01, P02, P03, P04, P05,
2075 P06) const volatile>
2080 template <typename T, typename S,
2081 typename P01, typename P02, typename P03, typename P04, typename P05,
2082 typename P06, typename P07>
2083 struct IsMemberFunctionPointerRaw<T (S:: *)(
2084 P01, P02, P03, P04, P05,
2085 P06, P07) const volatile>
2090 template <typename T, typename S,
2091 typename P01, typename P02, typename P03, typename P04, typename P05,
2092 typename P06, typename P07, typename P08>
2093 struct IsMemberFunctionPointerRaw<T (S:: *)(
2094 P01, P02, P03, P04, P05,
2095 P06, P07, P08) const volatile>
2100 template <typename T, typename S,
2101 typename P01, typename P02, typename P03, typename P04, typename P05,
2102 typename P06, typename P07, typename P08, typename P09>
2103 struct IsMemberFunctionPointerRaw<T (S:: *)(
2104 P01, P02, P03, P04, P05,
2105 P06, P07, P08, P09) const volatile>
2110 template <typename T, typename S,
2111 typename P01, typename P02, typename P03, typename P04, typename P05,
2112 typename P06, typename P07, typename P08, typename P09, typename P10>
2113 struct IsMemberFunctionPointerRaw<T (S:: *)(
2114 P01, P02, P03, P04, P05,
2115 P06, P07, P08, P09, P10) const volatile>
2120 template <typename T, typename S,
2121 typename P01, typename P02, typename P03, typename P04, typename P05,
2122 typename P06, typename P07, typename P08, typename P09, typename P10,
2124 struct IsMemberFunctionPointerRaw<T (S:: *)(
2125 P01, P02, P03, P04, P05,
2126 P06, P07, P08, P09, P10,
2127 P11) const volatile>
2132 template <typename T, typename S,
2133 typename P01, typename P02, typename P03, typename P04, typename P05,
2134 typename P06, typename P07, typename P08, typename P09, typename P10,
2135 typename P11, typename P12>
2136 struct IsMemberFunctionPointerRaw<T (S:: *)(
2137 P01, P02, P03, P04, P05,
2138 P06, P07, P08, P09, P10,
2139 P11, P12) const volatile>
2144 template <typename T, typename S,
2145 typename P01, typename P02, typename P03, typename P04, typename P05,
2146 typename P06, typename P07, typename P08, typename P09, typename P10,
2147 typename P11, typename P12, typename P13>
2148 struct IsMemberFunctionPointerRaw<T (S:: *)(
2149 P01, P02, P03, P04, P05,
2150 P06, P07, P08, P09, P10,
2151 P11, P12, P13) const volatile>
2156 template <typename T, typename S,
2157 typename P01, typename P02, typename P03, typename P04, typename P05,
2158 typename P06, typename P07, typename P08, typename P09, typename P10,
2159 typename P11, typename P12, typename P13, typename P14>
2160 struct IsMemberFunctionPointerRaw<T (S:: *)(
2161 P01, P02, P03, P04, P05,
2162 P06, P07, P08, P09, P10,
2163 P11, P12, P13, P14) const volatile>
2168 template <typename T, typename S,
2169 typename P01, typename P02, typename P03, typename P04, typename P05,
2170 typename P06, typename P07, typename P08, typename P09, typename P10,
2171 typename P11, typename P12, typename P13, typename P14, typename P15>
2172 struct IsMemberFunctionPointerRaw<T (S:: *)(
2173 P01, P02, P03, P04, P05,
2174 P06, P07, P08, P09, P10,
2175 P11, P12, P13, P14, P15) const volatile>
2180 template <typename T, typename S,
2181 typename P01, typename P02, typename P03, typename P04, typename P05,
2182 typename P06, typename P07, typename P08, typename P09, typename P10,
2183 typename P11, typename P12, typename P13, typename P14, typename P15,
2185 struct IsMemberFunctionPointerRaw<T (S:: *)(
2186 P01, P02, P03, P04, P05,
2187 P06, P07, P08, P09, P10,
2188 P11, P12, P13, P14, P15,
2189 P16) const volatile>
2194 template <typename T, typename S,
2195 typename P01, typename P02, typename P03, typename P04, typename P05,
2196 typename P06, typename P07, typename P08, typename P09, typename P10,
2197 typename P11, typename P12, typename P13, typename P14, typename P15,
2198 typename P16, typename P17>
2199 struct IsMemberFunctionPointerRaw<T (S:: *)(
2200 P01, P02, P03, P04, P05,
2201 P06, P07, P08, P09, P10,
2202 P11, P12, P13, P14, P15,
2203 P16, P17) const volatile>
2208 template <typename T, typename S,
2209 typename P01, typename P02, typename P03, typename P04, typename P05,
2210 typename P06, typename P07, typename P08, typename P09, typename P10,
2211 typename P11, typename P12, typename P13, typename P14, typename P15,
2212 typename P16, typename P17, typename P18>
2213 struct IsMemberFunctionPointerRaw<T (S:: *)(
2214 P01, P02, P03, P04, P05,
2215 P06, P07, P08, P09, P10,
2216 P11, P12, P13, P14, P15,
2217 P16, P17, P18) const volatile>
2222 template <typename T, typename S,
2223 typename P01, typename P02, typename P03, typename P04, typename P05,
2224 typename P06, typename P07, typename P08, typename P09, typename P10,
2225 typename P11, typename P12, typename P13, typename P14, typename P15,
2226 typename P16, typename P17, typename P18, typename P19>
2227 struct IsMemberFunctionPointerRaw<T (S:: *)(
2228 P01, P02, P03, P04, P05,
2229 P06, P07, P08, P09, P10,
2230 P11, P12, P13, P14, P15,
2231 P16, P17, P18, P19) const volatile>
2236 template <typename T, typename S,
2237 typename P01, typename P02, typename P03, typename P04, typename P05,
2238 typename P06, typename P07, typename P08, typename P09, typename P10,
2239 typename P11, typename P12, typename P13, typename P14, typename P15,
2240 typename P16, typename P17, typename P18, typename P19, typename P20>
2241 struct IsMemberFunctionPointerRaw<T (S:: *)(
2242 P01, P02, P03, P04, P05,
2243 P06, P07, P08, P09, P10,
2244 P11, P12, P13, P14, P15,
2245 P16, P17, P18, P19, P20) const volatile>
2250 template <typename T, typename S>
2251 struct IsMemberFunctionPointerRaw<T (S:: *)(
2252 ...) const volatile>
2257 template <typename T, typename S,
2259 struct IsMemberFunctionPointerRaw<T (S:: *)(
2260 P01, ...) const volatile>
2265 template <typename T, typename S,
2266 typename P01, typename P02>
2267 struct IsMemberFunctionPointerRaw<T (S:: *)(
2268 P01, P02, ...) const volatile>
2273 template <typename T, typename S,
2274 typename P01, typename P02, typename P03>
2275 struct IsMemberFunctionPointerRaw<T (S:: *)(
2276 P01, P02, P03, ...) const volatile>
2281 template <typename T, typename S,
2282 typename P01, typename P02, typename P03, typename P04>
2283 struct IsMemberFunctionPointerRaw<T (S:: *)(
2284 P01, P02, P03, P04, ...) const volatile>
2289 template <typename T, typename S,
2290 typename P01, typename P02, typename P03, typename P04, typename P05>
2291 struct IsMemberFunctionPointerRaw<T (S:: *)(
2292 P01, P02, P03, P04, P05,
2293 ...) const volatile>
2298 template <typename T, typename S,
2299 typename P01, typename P02, typename P03, typename P04, typename P05,
2301 struct IsMemberFunctionPointerRaw<T (S:: *)(
2302 P01, P02, P03, P04, P05,
2303 P06, ...) const volatile>
2308 template <typename T, typename S,
2309 typename P01, typename P02, typename P03, typename P04, typename P05,
2310 typename P06, typename P07>
2311 struct IsMemberFunctionPointerRaw<T (S:: *)(
2312 P01, P02, P03, P04, P05,
2313 P06, P07, ...) const volatile>
2318 template <typename T, typename S,
2319 typename P01, typename P02, typename P03, typename P04, typename P05,
2320 typename P06, typename P07, typename P08>
2321 struct IsMemberFunctionPointerRaw<T (S:: *)(
2322 P01, P02, P03, P04, P05,
2323 P06, P07, P08, ...) const volatile>
2328 template <typename T, typename S,
2329 typename P01, typename P02, typename P03, typename P04, typename P05,
2330 typename P06, typename P07, typename P08, typename P09>
2331 struct IsMemberFunctionPointerRaw<T (S:: *)(
2332 P01, P02, P03, P04, P05,
2333 P06, P07, P08, P09, ...) const volatile>
2338 template <typename T, typename S,
2339 typename P01, typename P02, typename P03, typename P04, typename P05,
2340 typename P06, typename P07, typename P08, typename P09, typename P10>
2341 struct IsMemberFunctionPointerRaw<T (S:: *)(
2342 P01, P02, P03, P04, P05,
2343 P06, P07, P08, P09, P10,
2344 ...) const volatile>
2349 template <typename T, typename S,
2350 typename P01, typename P02, typename P03, typename P04, typename P05,
2351 typename P06, typename P07, typename P08, typename P09, typename P10,
2353 struct IsMemberFunctionPointerRaw<T (S:: *)(
2354 P01, P02, P03, P04, P05,
2355 P06, P07, P08, P09, P10,
2356 P11, ...) const volatile>
2361 template <typename T, typename S,
2362 typename P01, typename P02, typename P03, typename P04, typename P05,
2363 typename P06, typename P07, typename P08, typename P09, typename P10,
2364 typename P11, typename P12>
2365 struct IsMemberFunctionPointerRaw<T (S:: *)(
2366 P01, P02, P03, P04, P05,
2367 P06, P07, P08, P09, P10,
2368 P11, P12, ...) const volatile>
2373 template <typename T, typename S,
2374 typename P01, typename P02, typename P03, typename P04, typename P05,
2375 typename P06, typename P07, typename P08, typename P09, typename P10,
2376 typename P11, typename P12, typename P13>
2377 struct IsMemberFunctionPointerRaw<T (S:: *)(
2378 P01, P02, P03, P04, P05,
2379 P06, P07, P08, P09, P10,
2380 P11, P12, P13, ...) const volatile>
2385 template <typename T, typename S,
2386 typename P01, typename P02, typename P03, typename P04, typename P05,
2387 typename P06, typename P07, typename P08, typename P09, typename P10,
2388 typename P11, typename P12, typename P13, typename P14>
2389 struct IsMemberFunctionPointerRaw<T (S:: *)(
2390 P01, P02, P03, P04, P05,
2391 P06, P07, P08, P09, P10,
2392 P11, P12, P13, P14, ...) const volatile>
2397 template <typename T, typename S,
2398 typename P01, typename P02, typename P03, typename P04, typename P05,
2399 typename P06, typename P07, typename P08, typename P09, typename P10,
2400 typename P11, typename P12, typename P13, typename P14, typename P15>
2401 struct IsMemberFunctionPointerRaw<T (S:: *)(
2402 P01, P02, P03, P04, P05,
2403 P06, P07, P08, P09, P10,
2404 P11, P12, P13, P14, P15,
2405 ...) const volatile>
2410 template <typename T, typename S,
2411 typename P01, typename P02, typename P03, typename P04, typename P05,
2412 typename P06, typename P07, typename P08, typename P09, typename P10,
2413 typename P11, typename P12, typename P13, typename P14, typename P15,
2415 struct IsMemberFunctionPointerRaw<T (S:: *)(
2416 P01, P02, P03, P04, P05,
2417 P06, P07, P08, P09, P10,
2418 P11, P12, P13, P14, P15,
2419 P16, ...) const volatile>
2424 template <typename T, typename S,
2425 typename P01, typename P02, typename P03, typename P04, typename P05,
2426 typename P06, typename P07, typename P08, typename P09, typename P10,
2427 typename P11, typename P12, typename P13, typename P14, typename P15,
2428 typename P16, typename P17>
2429 struct IsMemberFunctionPointerRaw<T (S:: *)(
2430 P01, P02, P03, P04, P05,
2431 P06, P07, P08, P09, P10,
2432 P11, P12, P13, P14, P15,
2433 P16, P17, ...) const volatile>
2438 template <typename T, typename S,
2439 typename P01, typename P02, typename P03, typename P04, typename P05,
2440 typename P06, typename P07, typename P08, typename P09, typename P10,
2441 typename P11, typename P12, typename P13, typename P14, typename P15,
2442 typename P16, typename P17, typename P18>
2443 struct IsMemberFunctionPointerRaw<T (S:: *)(
2444 P01, P02, P03, P04, P05,
2445 P06, P07, P08, P09, P10,
2446 P11, P12, P13, P14, P15,
2447 P16, P17, P18, ...) const volatile>
2452 template <typename T, typename S,
2453 typename P01, typename P02, typename P03, typename P04, typename P05,
2454 typename P06, typename P07, typename P08, typename P09, typename P10,
2455 typename P11, typename P12, typename P13, typename P14, typename P15,
2456 typename P16, typename P17, typename P18, typename P19>
2457 struct IsMemberFunctionPointerRaw<T (S:: *)(
2458 P01, P02, P03, P04, P05,
2459 P06, P07, P08, P09, P10,
2460 P11, P12, P13, P14, P15,
2461 P16, P17, P18, P19, ...) const volatile>
2466 template <typename T, typename S,
2467 typename P01, typename P02, typename P03, typename P04, typename P05,
2468 typename P06, typename P07, typename P08, typename P09, typename P10,
2469 typename P11, typename P12, typename P13, typename P14, typename P15,
2470 typename P16, typename P17, typename P18, typename P19, typename P20>
2471 struct IsMemberFunctionPointerRaw<T (S:: *)(
2472 P01, P02, P03, P04, P05,
2473 P06, P07, P08, P09, P10,
2474 P11, P12, P13, P14, P15,
2475 P16, P17, P18, P19, P20,
2476 ...) const volatile>
2481 }// namespace Private
2483 ////////////////////////////////////////////////////////////////////////////////
2484 // class template TypeTraits
2486 // Figures out at compile time various properties of any given type
2487 // Invocations (T is a type, TypeTraits<T>::Property):
2489 // - isPointer : returns true if T is a pointer type
2490 // - PointeeType : returns the type to which T points if T is a pointer
2491 // type, NullType otherwise
2492 // - isReference : returns true if T is a reference type
2493 // - ReferredType : returns the type to which T refers if T is a reference
2494 // type, NullType otherwise
2495 // - isMemberPointer : returns true if T is a pointer to member type
2496 // - isStdUnsignedInt: returns true if T is a standard unsigned integral type
2497 // - isStdSignedInt : returns true if T is a standard signed integral type
2498 // - isStdIntegral : returns true if T is a standard integral type
2499 // - isStdFloat : returns true if T is a standard floating-point type
2500 // - isStdArith : returns true if T is a standard arithmetic type
2501 // - isStdFundamental: returns true if T is a standard fundamental type
2502 // - isUnsignedInt : returns true if T is a unsigned integral type
2503 // - isSignedInt : returns true if T is a signed integral type
2504 // - isIntegral : returns true if T is a integral type
2505 // - isFloat : returns true if T is a floating-point type
2506 // - isArith : returns true if T is a arithmetic type
2507 // - isFundamental : returns true if T is a fundamental type
2508 // - ParameterType : returns the optimal type to be used as a parameter for
2509 // functions that take Ts
2510 // - isConst : returns true if T is a const-qualified type
2511 // - NonConstType : Type with removed 'const' qualifier from T, if any
2512 // - isVolatile : returns true if T is a volatile-qualified type
2513 // - NonVolatileType : Type with removed 'volatile' qualifier from T, if any
2514 // - UnqualifiedType : Type with removed 'const' and 'volatile' qualifiers from
2516 // - ParameterType : returns the optimal type to be used as a parameter
2517 // for functions that take 'const T's
2519 ////////////////////////////////////////////////////////////////////////////////
2521 template <typename T>
2526 template <class U> struct ReferenceTraits
2528 enum { result = false };
2529 typedef U ReferredType;
2532 template <class U> struct ReferenceTraits<U &>
2534 enum { result = true };
2535 typedef U ReferredType;
2538 template <class U> struct PointerTraits
2540 enum { result = false };
2541 typedef NullType PointeeType;
2544 template <class U> struct PointerTraits<U *>
2546 enum { result = true };
2547 typedef U PointeeType;
2550 template <class U> struct PointerTraits<U* &>
2552 enum { result = true };
2553 typedef U PointeeType;
2556 template <class U> struct PToMTraits
2558 enum { result = false };
2561 template <class U, class V> struct PToMTraits<U V:: *>
2563 enum { result = true };
2566 template <class U, class V> struct PToMTraits<U V::* &>
2568 enum { result = true };
2571 template <class U> struct FunctionPointerTraits
2573 enum { result = Private::IsFunctionPointerRaw<U>::result };
2576 template <typename U> struct PToMFunctionTraits
2578 enum { result = Private::IsMemberFunctionPointerRaw<U>::result };
2581 template <class U> struct UnConst
2584 enum { isConst = 0 };
2587 template <class U> struct UnConst<const U>
2590 enum { isConst = 1 };
2593 template <class U> struct UnConst<const U &>
2596 enum { isConst = 1 };
2599 template <class U> struct UnVolatile
2602 enum { isVolatile = 0 };
2605 template <class U> struct UnVolatile<volatile U>
2608 enum { isVolatile = 1 };
2611 template <class U> struct UnVolatile<volatile U &>
2614 enum { isVolatile = 1 };
2618 typedef typename UnConst<T>::Result
2620 typedef typename UnVolatile<T>::Result
2622 typedef typename UnVolatile<typename UnConst<T>::Result>::Result
2624 typedef typename PointerTraits<UnqualifiedType>::PointeeType
2626 typedef typename ReferenceTraits<T>::ReferredType
2629 enum { isConst = UnConst<T>::isConst };
2630 enum { isVolatile = UnVolatile<T>::isVolatile };
2631 enum { isReference = ReferenceTraits<UnqualifiedType>::result };
2632 enum { isFunction = FunctionPointerTraits<typename Private::AddPointer<T>::Result >::result };
2633 enum { isFunctionPointer= FunctionPointerTraits<
2634 typename ReferenceTraits<UnqualifiedType>::ReferredType >::result
2636 enum { isMemberFunctionPointer= PToMFunctionTraits<
2637 typename ReferenceTraits<UnqualifiedType>::ReferredType >::result
2639 enum { isMemberPointer = PToMTraits<
2640 typename ReferenceTraits<UnqualifiedType>::ReferredType >::result ||
2641 isMemberFunctionPointer
2643 enum { isPointer = PointerTraits<
2644 typename ReferenceTraits<UnqualifiedType>::ReferredType >::result ||
2648 enum { isStdUnsignedInt = TL::IndexOf<Private::StdUnsignedInts, UnqualifiedType>::value >= 0 ||
2649 TL::IndexOf<Private::StdUnsignedInts,
2650 typename ReferenceTraits<UnqualifiedType>::ReferredType>::value >= 0
2652 enum { isStdSignedInt = TL::IndexOf<Private::StdSignedInts, UnqualifiedType>::value >= 0 ||
2653 TL::IndexOf<Private::StdSignedInts,
2654 typename ReferenceTraits<UnqualifiedType>::ReferredType>::value >= 0
2656 enum { isStdIntegral = isStdUnsignedInt || isStdSignedInt ||
2657 TL::IndexOf<Private::StdOtherInts, UnqualifiedType>::value >= 0 ||
2658 TL::IndexOf<Private::StdOtherInts,
2659 typename ReferenceTraits<UnqualifiedType>::ReferredType>::value >= 0
2662 enum { isStdFloat = TL::IndexOf<Private::StdFloats, UnqualifiedType>::value >= 0 ||
2663 TL::IndexOf<Private::StdFloats,
2664 typename ReferenceTraits<UnqualifiedType>::ReferredType>::value >= 0
2667 enum { isStdSignedLong = TL::IndexOf<Private::StdSignedLong, UnqualifiedType>::value >= 0 ||
2668 TL::IndexOf<Private::StdSignedLong,
2669 typename ReferenceTraits<UnqualifiedType>::ReferredType>::value >= 0
2672 enum { isStdUnsignedLong = TL::IndexOf<Private::StdUnsignedLong, UnqualifiedType>::value >= 0 ||
2673 TL::IndexOf<Private::StdUnsignedLong,
2674 typename ReferenceTraits<UnqualifiedType>::ReferredType>::value >= 0
2677 enum { isStdArith = isStdIntegral || isStdFloat };
2678 enum { isStdFundamental = isStdArith || isStdFloat || Conversion<T, void>::sameType };
2680 enum { isUnsignedInt = isStdUnsignedInt || IsCustomUnsignedInt<UnqualifiedType>::value };
2681 enum { isSignedInt = isStdSignedInt || IsCustomSignedInt<UnqualifiedType>::value };
2682 enum { isIntegral = isStdIntegral || isUnsignedInt || isSignedInt };
2683 enum { isFloat = isStdFloat || IsCustomFloat<UnqualifiedType>::value };
2684 enum { isArith = isIntegral || isFloat };
2685 enum { isFundamental = isStdFundamental || isArith };
2688 ((uint)isConst << LOKI_IS_CONST_BIT) +
2689 ((uint)isVolatile << LOKI_IS_VOLATILE_BIT) +
2690 ((uint)isReference << LOKI_IS_REFERENCE_BIT) +
2691 ((uint)isFunction << LOKI_IS_FUNCTION) +
2692 ((uint)isFunctionPointer << LOKI_IS_FUNCTION_POINTER) +
2693 ((uint)isMemberFunctionPointer << LOKI_IS_MEMBER_FUNCTION_POINTER) +
2694 ((uint)isMemberPointer << LOKI_IS_MEMBER_POINTER) +
2695 ((uint)isPointer << LOKI_IS_POINTER) +
2696 ((uint)isStdUnsignedInt << LOKI_IS_STD_UNSIGNED_INT) +
2697 ((uint)isStdSignedInt << LOKI_IS_STD_SIGNED_INT) +
2698 ((uint)isStdIntegral << LOKI_IS_STD_INTEGRAL) +
2699 ((uint)isStdFundamental << LOKI_IS_STD_FUNDAMENTAL) +
2700 ((uint)isUnsignedInt << LOKI_IS_UNSIGNED_INT) +
2701 ((uint)isSignedInt << LOKI_IS_SIGNED_INT) +
2702 ((uint)isIntegral << LOKI_IS_INTEGRAL) +
2703 ((uint)isFloat << LOKI_IS_FLOAT) +
2704 ((uint)isArith << LOKI_IS_ARITH) +
2705 ((uint)isFundamental << LOKI_IS_FUNDAMENTAL) +
2706 ((uint)isStdSignedLong << LOKI_IS_SIGNED_LONG) +
2707 ((uint)isStdUnsignedLong << LOKI_IS_UNSIGNED_LONG)
2710 typedef typename Select<isStdArith || isPointer || isMemberPointer, T,
2711 typename Private::AddParameterType<T>::Result>::Result
2715 template<typename T>
2720 result = TypeTraits<T>::isPointer
2725 struct type_is_ptr<void>
2734 struct type_is_ptr<const void>
2744 #pragma warning( pop )
2748 #endif // end file guardian