2010-05-08 70 views
285

我有一個類C++模板的typedef

template<size_t N, size_t M> 
class Matrix { 
    // .... 
}; 

我想使一個typedef它創建了一個Vector(列矢量),其等同於一個Matrix與尺寸N和1類似的東西:

typedef Matrix<N,1> Vector<N>; 

這會產生編譯錯誤。下面創建一個類似的東西,但不正是我想要的:

template <int N> 
class Vector: public Matrix<N,1> 
{ }; 

是否有解決方案或不太貴的解決辦法/最佳實踐呢?

+15

剛剛注意到(近三年後),您(意外?)在您的示例解決方案中使用'int'而不是'size_t'。他們應該可能匹配。 :) – GManNickG 2013-01-11 19:29:19

回答

428

C++ 11加入別名聲明,它們是typedef一般化,允許模板:

template <size_t N> 
using Vector = Matrix<N, 1>; 

類型Vector<3>相當於Matrix<3, 1>


在C++ 03,最接近的近似是:

template <size_t N> 
struct Vector 
{ 
    typedef Matrix<N, 1> type; 
}; 

這裏,類型Vector<3>::type相當於Matrix<3, 1>

+32

噢,太棒了,我沒有看到C++ 0x的這部分,我一直在模仿typedef一陣子......我猜應該對最後的草稿有更全面的瞭解。 – 2010-05-09 11:19:58

+2

繼承構造函數是否使OP的原始解決方案更具可行性? – StackedCrooked 2012-08-24 06:07:32

+2

@StackedCrooked:取決於他的目標。我避免繼承時組成會做(是的,繼承構造函數將使這兩個更容易),但我也避免組合時,typedef會做。 – GManNickG 2012-08-24 14:34:28