我試圖實現一個非常基本的Vector3
(Vec3
)類。 我正在努力處理一個特例: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;
};
究竟是什麼問題? – Petr
作爲僅供參考,您不需要在所有功能上使用內聯。請參見:[是否在類定義中定義的C++成員函數中隱含「內聯」)(http://stackoverflow.com/questions/9192077/is-inline-implicit-in-c-member-functions-defined-in-class-定義) – NathanOliver
@NathanOliver。謝謝你的提示。 – blaurent