2013-04-13 20 views
3

我有不同類型的矩陣,我想創建一個廣義的子矩陣參考類MatrixRef使用sfinae啓用/禁用typedef是不可能的。解決方法?

矩陣實現只有幾個成員的像row(i)column(i)diagonal()等和道定義相應的類型row_vector

MatrixRef我想,如果模板參數C還沒有例如定義col_vector,MatrixRef也沒有定義col_vector。或者作爲變通方法定義它void

對於函數成員我發現了一個工作的解決方案,但在類型定義沒有。

struct Matrix 
{ 
    typedef vector<double>& row_vector; 
    //typedef ColumnContainerReference col_vector; 
    typedef DiagonalContainerReference diag_vector; 

    row_vector row(size_type i); 
    //col_vector col(size_type i); 
    diag_vector diagonal(); 
}; 


template<typename C> 
struct MatrixRef 
{ 
    typedef typename C::row_vector row_vector; 
    typedef typename C::col_vector col_vector; 
    typedef typename C::diag_vector diag_vector; 

    template<typename C1 = C> 
    typename enable_if<is_matrix<C1>::has_rows, row_vector>::type 
    row(size_type i); 
    ...... col(size_type i); 
    ...... diagonal(); 
}; 

回答

2

您可以定義特性的基類:

template<typename C, typename = void> 
struct row_vector_alias_definer{ }; 

template<typename C> 
struct row_vector_alias_definer<C, 
    typename std::enable_if< 
     std::is_same<typename C::row_vector, typename C::row_vector>::value 
     >::type> 
{ 
    typedef typename C::row_vector row_vector; 
}; 

然後讓你的類從的,適當的實例得出traits模板:

template<typename C> 
struct MatrixRef : public row_vector_alias_definer<C> 
{ 
    // ... 
}; 

其他可選類型同樣的事情別名。

相關問題