使用sfinae启用/禁用typedef是不可能的。解决方法?

时间:2013-04-13 14:03:42

标签: c++ templates sfinae

我有不同类型的矩阵,我想创建一个通用子矩阵引用类MatrixRef

矩阵仅实现少数成员,例如row(i)column(i)diagonal()等,并且当然会定义相应的类型row_vector等。

我需要MatrixRef,如果模板参数C没有定义,例如col_vectorMatrixRef也未定义col_vector。或者作为变通方法定义它void

对于函数成员,我找到了一个可行的解决方案,但是在typedef上没有。

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();
};

1 个答案:

答案 0 :(得分: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;
};

然后让你的类派生出该特征模板的适当实例:

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

其他可选类型别名也是如此。