使类使用浮点数和整数(分析一段代码)

Making your classes work with floats as well as with integers (analyzing a piece of code)

本文关键字:一段 代码 整数 浮点数      更新时间:2023-10-16

我正在分析一段代码,我遇到了这个

class X 
{ 
//content
}; 
typedef X<float> X; 

有人可以指出我更接近此来源的东西(使用 <type>基本上使第二个类与第二种类型一起工作)被称为,它是如何工作的,或者在什么情况下我们使用它,以便我可以继续搜索。(在我的例子中,它被用作定义三维向量的类。

这是整个代码:

template<typename T> 
class Vec3 
{ 
public: 
    T x, y, z; 
    Vec3() : x(T(0)), y(T(0)), z(T(0)) {} 
    Vec3(T xx) : x(xx), y(xx), z(xx) {} 
    Vec3(T xx, T yy, T zz) : x(xx), y(yy), z(zz) {} 
    Vec3& normalize() 
    { 
        T nor2 = length2(); 
        if (nor2 > 0) { 
            T invNor = 1 / sqrt(nor2); 
            x *= invNor, y *= invNor, z *= invNor; 
        } 
        return *this; 
    } 
    Vec3<T> operator * (const T &f) const { return Vec3<T>(x * f, y * f, z * f); } 
    Vec3<T> operator * (const Vec3<T> &v) const { return Vec3<T>(x * v.x, y * v.y, z * v.z); } 
    T dot(const Vec3<T> &v) const { return x * v.x + y * v.y + z * v.z; } 
    Vec3<T> operator - (const Vec3<T> &v) const { return Vec3<T>(x - v.x, y - v.y, z - v.z); } 
    Vec3<T> operator + (const Vec3<T> &v) const { return Vec3<T>(x + v.x, y + v.y, z + v.z); } 
    Vec3<T>& operator += (const Vec3<T> &v) { x += v.x, y += v.y, z += v.z; return *this; } 
    Vec3<T>& operator *= (const Vec3<T> &v) { x *= v.x, y *= v.y, z *= v.z; return *this; } 
    Vec3<T> operator - () const { return Vec3<T>(-x, -y, -z); } 
    T length2() const { return x * x + y * y + z * z; } 
    T length() const { return sqrt(length2()); } 
    friend std::ostream & operator << (std::ostream &os, const Vec3<T> &v) 
    { 
        os << "[" << v.x << " " << v.y << " " << v.z << "]"; 
        return os; 
    } 
}; 
typedef Vec3<float> Vec3f; 

您可能错过了class X之前出现的一些相关代码:

template <typename T> // <<<<<<<<<<<<<<<<<<<<<<
class X 
{ 
//content
}; 

有人可以指出更接近这种名称的来源的东西吗?

这称为类模板

它是如何工作的

类模板定义中提供的代码将实例化为各种类型的

类型,如
typedef X<float> X; 

typedef X<int> Y;