runnig

c++ template test

Nov 30th, 2012
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.15 KB | None | 0 0
  1. // This snippet answers several answers about c++ template programming
  2.  
  3. #include <iostream>
  4. #include <typeinfo>
  5. #include <string>
  6. #include <stdlib.h>
  7.  
  8. template < typename T >
  9. T sq(T v) { return v*v;}
  10.  
  11. template < typename T, typename R>
  12. R sq(T v) { return R(v*v);}
  13.  
  14. template <typename T, typename R>
  15. R length3(const T * arr)
  16. {
  17.    return sq<T,R>(arr[0]) + sq<T,R>(arr[1]) + sq<T,R>(arr[2]);
  18. }
  19. template <typename T, typename R>
  20. R length3(const T & v)
  21. {
  22.    return sq<T,R>(v[0]) + sq<T,R>(v[1]) + sq<T,R>(v[2]);
  23. }
  24.  
  25. #include <cxxabi.h>
  26.  
  27. const std::string demangle(const char* name)
  28. {
  29.     int status = -4;
  30.  
  31.     char* res = abi::__cxa_demangle(name, NULL, NULL, &status);
  32.  
  33.     const char* const demangled_name = (status==0)?res:name;
  34.  
  35.     std::string ret_val(demangled_name);
  36.  
  37.     free(res);
  38.  
  39.     return ret_val;
  40. }
  41.  
  42. template <typename T> struct IsRef {
  43.   static bool const result = false;
  44. };
  45. template <typename T> struct IsRef<T&> {
  46.   static bool const result = true;
  47. };
  48.  
  49. // types with operator [] defined
  50. template <typename T, typename R >
  51. R distance3(const T & p1, const T & p2)
  52. {
  53.     std::cout << "distance T& " << demangle(typeid(T).name()) << '\n';
  54.  
  55.     R d[3];
  56.     d[0] = p1[0] - p2[0];
  57.     d[1] = p1[1] - p2[1];
  58.     d[2] = p1[2] - p2[2];
  59.     return length3<R,R>(&d[0]);
  60. }
  61.  
  62. template <typename T, typename R >
  63. R distance3(const T * p1, const T * p2)
  64. {
  65.     std::cout << "distance T* " << demangle(typeid(T).name()) << '\n';
  66.     R d[3];
  67.     d[0] = p1[0] - p2[0];
  68.     d[1] = p1[1] - p2[1];
  69.     d[2] = p1[2] - p2[2];
  70.     return length3<R,R>(&d[0]);
  71. }
  72.  
  73. template < class T >
  74. struct Vec3
  75. {
  76.     typedef T value_type;
  77.     Vec3(T x) { data[0] = data[1] = data[2] = x; }
  78.     Vec3(T a, T b, T c) { data[0] = a; data[1] = b; data[2] = c; }
  79.  
  80.     T & operator[] (int i) { return data[i]; }
  81.     const T & operator[] (int i) const { return data[i]; }
  82.     T data[3];
  83. };
  84.  
  85. typedef Vec3<float> Vec3f;
  86. typedef Vec3<int> Vec3i;
  87.  
  88.  
  89. int main(int argc, char* argv[])
  90. {
  91.     Vec3i v0(2,2,2), v1(4,4,4);
  92.  
  93.     signed char a[3] = {2,2,2};
  94.     signed char b[3] = {-1,-1,-1};
  95.  
  96.  
  97.     std::cout << distance3<Vec3i,float>(v0,v1) << '\n';
  98.     std::cout << distance3<signed char*,int>(a, b) << '\n';
  99.  
  100.     return 0;
  101. }
Advertisement
Add Comment
Please, Sign In to add comment