2015-06-29 80 views
0

我試圖實現一個非常基本的Vector3Vec3)類。 我正在努力處理一個特例:Vec3<size_t>加上Vec3<int>成員函數的C++模板專門化

如何爲這種情況製作模板專業化?

任何幫助,將不勝感激。 本

#include <array> 
#include <ostream> 
#include <vector> 

// #define Vec3f std::array<float, 3> 
// #define Vec3u std::array<size_t, 3> 

#define Vec3f Vec3<float> 
#define Vec3u Vec3<size_t> 
#define Vec3i Vec3<int> 

template <typename T> 
class Vec3 
{ 
    public: 
     Vec3(): _a() {} 
     Vec3(T x, T y, T z): _a({x, y, z}) {} 
     Vec3(const Vec3<T> & a): _a({a[0], a[1], a[2]}) {} 

     ~Vec3() {} 

     /// Print Vec3. 
     friend std::ostream & operator<<(std::ostream & os, const Vec3<T> & v) 
     { 
      os << "(" << v[0] << ", " << v[1] << ", " << v[2] << ")"; 
      return os; 
     } 

     inline typename std::array<T, 3>::reference operator[](size_t i) 
     { 
      return _a[i]; 
     } 

     inline typename std::array<T, 3>::const_reference operator[](size_t i) const 
     { 
      return _a[i]; 
     } 


     /// Test equality. 
     inline bool operator==(const Vec3<T> & other) const 
     { 
      bool a = abs(_a[0] - other._a[0]) < 1e-6; 
      bool b = abs(_a[1] - other._a[1]) < 1e-6; 
      bool c = abs(_a[2] - other._a[2]) < 1e-6; 
      return (a and b and c); 
     } 

     /// Test non-equality. 
     inline bool operator!=(const Vec3<T> & other) const 
     { 
      return not (*this == other); 
     } 


     /// Vec3 same type addition. 
     inline Vec3<T> operator+(const Vec3<T> & other) const 
     { 
      return {_a[0] + other[0], _a[1] + other[1], _a[2] + other[2]}; 
     } 


    protected: 
     std::array<T, 3> _a; 
}; 
+2

究竟是什麼問題? – Petr

+0

作爲僅供參考,您不需要在所有功能上使用內聯。請參見:[是否在類定義中定義的C++成員函數中隱含「內聯」)(http://stackoverflow.com/questions/9192077/is-inline-implicit-in-c-member-functions-defined-in-class-定義) – NathanOliver

+0

@NathanOliver。謝謝你的提示。 – blaurent

回答

3

你的問題是要找到size_tint之間的共同類型是結果的模板參數。 這是一個可能的解決方案:

/// Vec3 addition between vectors of different base type. 
template <class U> 
Vec3<typename std::common_type<T, U>::type> operator+(const Vec3<U> & other) const 
{ 
    return{ _a[0] + other[0], _a[1] + other[1], _a[2] + other[2] }; 
} 
+0

取決於預期的結果''可以使用'Vec3 ()+ declval ())>'而不是'common_type'('char + char'是'int',但它的通用類型是'char') – Jarod42

+0

@ Jarod42:感謝您的評論,這是我錯過的觀點。但是我發現了一些上下文,其中規則char + char-> int是可以的,因爲它防止溢出(上下文是RGB像素,問題在於基於int的像素遲早會以某種方式轉換回char版本) – marom

+0

謝謝你們的幫助。不幸的是,這並不像我想的那樣嚴格。我希望**功能**可以添加'Vec3 '和'Vec3 '。例如,您的解決方案太過寬容,因爲它們也實施Vec3 '和Vec3 '。 – blaurent