簡體   English   中英

如何聲明模板類的不同類型之間的轉換

[英]How to declare conversions between different types of a templated class

我有一個模板化的幾何向量類。 這是它的簡化版本。

template<class T>
class Vec3 {

public:
    Vec3(const T& x, const T& y, const T& z) {
        m_v[0] = x;
        m_v[1] = y;
        m_v[2] = z;
    }

    T m_v[3];
};

我使用此類的雙版本和浮動版本。

using Vec3D = Vec3<double>;
using Vec3F = Vec3<float>;

我想補充的是從浮點版本到雙版本的隱式轉換。 最好的方法是什么?

您可以添加模板構造函數(可能使用 SFINAE):

template<class T>
class Vec3 {

public:
    Vec3(const T& x, const T& y, const T& z) {
        m_v[0] = x;
        m_v[1] = y;
        m_v[2] = z;
    }

    // It is not a copy constructor.
    template <typename U>
    Vec3(const Vec3<U>& rhs) {
        m_v[0] = rhs.m_m_v[0];
        m_v[1] = rhs.m_m_v[1];
        m_v[2] = rhs.m_m_v[2];
    }

    T m_v[3];
};

如果您只想將 float 處理為 double,在 C++20 中,您可以使用requires來“丟棄”方法:

template<class T>
class Vec3 {

public:
    Vec3(const T& x, const T& y, const T& z) {
        m_v[0] = x;
        m_v[1] = y;
        m_v[2] = z;
    }

    Vec3(const Vec3<float>& rhs) requires (std::is_same_v<double, T>) {
        m_v[0] = rhs.m_m_v[0];
        m_v[1] = rhs.m_m_v[1];
        m_v[2] = rhs.m_m_v[2];
    }

    T m_v[3];
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM