kaenan

Template alias

Apr 13th, 2018
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.74 KB | None | 0 0
  1. /* Needed for the macro to work on MSVC. https://stackoverflow.com/a/7459803 */
  2. #define EXPAND__MACRO( x ) x
  3.  
  4. /* Count number of arguments. https://groups.google.com/d/msg/comp.std.c/d-6Mj5Lko_s/5R6bMWTEbzQJ */
  5. #define NARG(...) EXPAND__MACRO(NARG_(__VA_ARGS__, PAD_N))
  6. #define NARG_(...) EXPAND__MACRO(ARG_N(__VA_ARGS__))
  7. #define ARG_N(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N
  8. #define PAD_N 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
  9.  
  10. #define ___get_1(TYPE, ...)  typename TYPE
  11. #define ___get_2(TYPE, ...)  typename TYPE, EXPAND__MACRO(___get_1(__VA_ARGS__))
  12. #define ___get_3(TYPE, ...)  typename TYPE, EXPAND__MACRO(___get_2(__VA_ARGS__))
  13. #define ___get_4(TYPE, ...)  typename TYPE, EXPAND__MACRO(___get_3(__VA_ARGS__))
  14. #define ___get_5(TYPE, ...)  typename TYPE, EXPAND__MACRO(___get_4(__VA_ARGS__))
  15. #define ___get_6(TYPE, ...)  typename TYPE, EXPAND__MACRO(___get_5(__VA_ARGS__))
  16. #define ___get_7(TYPE, ...)  typename TYPE, EXPAND__MACRO(___get_6(__VA_ARGS__))
  17. #define ___get_8(TYPE, ...)  typename TYPE, EXPAND__MACRO(___get_7(__VA_ARGS__))
  18. #define ___get_9(TYPE, ...)  typename TYPE, EXPAND__MACRO(___get_8(__VA_ARGS__))
  19. #define ___get_10(TYPE, ...) typename TYPE, EXPAND__MACRO(___get_9(__VA_ARGS__))
  20.  
  21. #define ___get_n(__nargs, ...) EXPAND__MACRO(___get_ ## __nargs(__VA_ARGS__))
  22. #define ___redirect_generic_again(__nargs, ...) EXPAND__MACRO(___get_n(__nargs, __VA_ARGS__))
  23. #define ___redirect_generic(__nargs, ...) EXPAND__MACRO(___redirect_generic_again(__nargs, __VA_ARGS__))
  24.  
  25. #define generic(...) EXPAND__MACRO(template < ___redirect_generic( NARG(__VA_ARGS__), __VA_ARGS__) >)
  26.  
  27. // Example
  28. // Insted of:
  29. template< typename Foo, typename Bar, typename Key, typename Hash, typename Pred >
  30. // you would write:
  31. generic(Foo, Bar, Key, Hash, Pred)
Add Comment
Please, Sign In to add comment