onilink_

Templates Variadics Snippets

Oct 21st, 2015
268
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.45 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using std::cout;
  4. using std::endl;
  5.  
  6. template <int... Args>
  7. struct StaticArray
  8. {
  9.     static const unsigned int size = sizeof...(Args);
  10.     int array[sizeof...(Args)] = {Args...};
  11. };
  12.  
  13. template <class C, class... Args>
  14. C * make_new(Args&&... args)
  15. {
  16.     return new C(std::forward<Args>(args)...);
  17. }
  18.  
  19. template<typename T> T sum(const T& t) { return t; }
  20. template<typename T, typename... Args> T sum(const T& val, const Args&... rest)
  21. {
  22.     return val + sum(rest...);
  23. }
  24.  
  25. template <class... Ts>
  26. size_t sizeofSum()
  27. {
  28.     size_t sum = 0;
  29.     for(size_t s : {sizeof(Ts)...})
  30.         sum += s;
  31.     return sum;
  32. }
  33.  
  34. template<int x> struct T {
  35.     static const int var = x;
  36. };
  37. template<typename... Args> bool staticMemberAllEqualTo(int value)
  38. {
  39.     bool ret = true;
  40.     using Expand = int[];
  41.     (void)Expand{0, (void(Args::var == value ? 0 : (ret = false)), 0)...};
  42.     return ret;
  43. }
  44. // c++17 way
  45. //template <class... Is> bool checkAllArgs(Is... args) {
  46. //    return ((args == 5) && ...);
  47. //}
  48. template<typename... Args>
  49. void setStaticMembersTo(int x)
  50. {
  51.     [](...){}((Args::var = x)...);
  52. }
  53.  
  54. int main()
  55. {
  56.     StaticArray<1, 2, 3, 4> t;
  57.     int * ptr = make_new<int>(123);
  58.     cout << sum(1, 2, 3, 4) << endl;
  59.     cout << sizeofSum<double, int, short, char>() << endl;
  60.     cout << staticMemberAllEqualTo< T<5>, T<5>, T<5> >(5) << endl;
  61.     //cout << checkAllArgs(5, 5, 5) << endl;
  62.    
  63.     delete ptr;
  64.     return 0;
  65. }
Advertisement
Add Comment
Please, Sign In to add comment