Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // This snippet answers several answers about c++ template programming
- #include <iostream>
- #include <typeinfo>
- #include <string>
- #include <stdlib.h>
- template < typename T >
- T sq(T v) { return v*v;}
- template < typename T, typename R>
- R sq(T v) { return R(v*v);}
- template <typename T, typename R>
- R length3(const T * arr)
- {
- return sq<T,R>(arr[0]) + sq<T,R>(arr[1]) + sq<T,R>(arr[2]);
- }
- template <typename T, typename R>
- R length3(const T & v)
- {
- return sq<T,R>(v[0]) + sq<T,R>(v[1]) + sq<T,R>(v[2]);
- }
- #include <cxxabi.h>
- const std::string demangle(const char* name)
- {
- int status = -4;
- char* res = abi::__cxa_demangle(name, NULL, NULL, &status);
- const char* const demangled_name = (status==0)?res:name;
- std::string ret_val(demangled_name);
- free(res);
- return ret_val;
- }
- template <typename T> struct IsRef {
- static bool const result = false;
- };
- template <typename T> struct IsRef<T&> {
- static bool const result = true;
- };
- // types with operator [] defined
- template <typename T, typename R >
- R distance3(const T & p1, const T & p2)
- {
- std::cout << "distance T& " << demangle(typeid(T).name()) << '\n';
- R d[3];
- d[0] = p1[0] - p2[0];
- d[1] = p1[1] - p2[1];
- d[2] = p1[2] - p2[2];
- return length3<R,R>(&d[0]);
- }
- template <typename T, typename R >
- R distance3(const T * p1, const T * p2)
- {
- std::cout << "distance T* " << demangle(typeid(T).name()) << '\n';
- R d[3];
- d[0] = p1[0] - p2[0];
- d[1] = p1[1] - p2[1];
- d[2] = p1[2] - p2[2];
- return length3<R,R>(&d[0]);
- }
- template < class T >
- struct Vec3
- {
- typedef T value_type;
- Vec3(T x) { data[0] = data[1] = data[2] = x; }
- Vec3(T a, T b, T c) { data[0] = a; data[1] = b; data[2] = c; }
- T & operator[] (int i) { return data[i]; }
- const T & operator[] (int i) const { return data[i]; }
- T data[3];
- };
- typedef Vec3<float> Vec3f;
- typedef Vec3<int> Vec3i;
- int main(int argc, char* argv[])
- {
- Vec3i v0(2,2,2), v1(4,4,4);
- signed char a[3] = {2,2,2};
- signed char b[3] = {-1,-1,-1};
- std::cout << distance3<Vec3i,float>(v0,v1) << '\n';
- std::cout << distance3<signed char*,int>(a, b) << '\n';
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment