簡體   English   中英

C ++ - 使用默認模板作為專業化的基礎

[英]C++ - Use default template as base for specialization

我想寫一個數學矢量模板。 我有一個接受類型和大小作為模板參數的類,有很多數學運算方法。 現在我想編寫專門化,其中Vector <3>例如x,y,z作為成員分別引用數據[0..3]。

問題是我不知道如何創建一個從默認模板繼承所有內容的特化,而無需創建基類或編寫所有內容兩次。

最有效的方法是什么?

template<class Type, size_t Size>
class Vector {
    // stuff
};

template<class T>
class Vector<3,T>: public Vector {
    public:
        T &x, &y, &z;
        Vector(): Vector<>(), x(data[0]), y(data[1]), z(data[2]){}
        // and so on
};

不知何故,你應該能夠從默認實現派生,但你是專門的實例,那么如何? 它應該是一個非專業版本,您可以從中派生出來。 這很簡單:

// Add one extra argument to keep non-specialized version!
template<class Type, size_t Size, bool Temp = true>
class Vector {
    // stuff
};
// And now our specialized version derive from non-specialized version!
template<class T>
class Vector<T, 3, true>: public Vector<T, 3, false> {
    public:
        T &x, &y, &z;
        Vector(): Vector<>(), x(data[0]), y(data[1]), z(data[2]){}
        // and so on
};

考慮以稍微不同的方式進行此操作,但目標將實現,添加外部接口 - 我的意思是獨立函數X(),Y(),Z():

template<class T, size_t S>
T& x(Vector<T, S>& obj, typename std::enable_if<(S>=1)>::type* = nullptr)
{
   return obj.data[0];
}

template<class T, size_t S>
T& y(Vector<T, S>& obj, typename std::enable_if<(S>=2)>::type* = nullptr)
{
   return obj.data[1];
}

template<class T, size_t S>
T& z(Vector<T, S>& obj, typename std::enable_if<(S>=3)>::type* = nullptr)
{
   return obj.data[2];
}

兩者之間沒有太大區別:

 Vector<T, 3>& obj
 return obj.x();

 Vector<T, 3>& obj
 return x(obj);

作為獎勵 - 此界面適用於匹配大小。

暫無
暫無

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

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