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

标签 c++ templates sfinae

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

矩阵只实现了一些成员,例如 row(i)column(i)diagonal() 等,当然定义相应的类型row_vector

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

最佳答案

您可以定义一个特征基类:

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>
{
    // ...
};

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

关于c++ - 使用 sfinae 启用/禁用 typedef 是不可能的。解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15988646/

相关文章:

c++ - 在 C++ 中实现 Text-Gap 后的奇怪行为

c++ - 我怎样才能理解这些析构函数?

c++ - 如何在模板函数签名中要求 const_iterator 语义?

c++ - 非模板类方法的条件模板特化

c++ - SFINAE 没有避免模棱两可的调用

c++ - 为什么不推荐使用 TClientSocket 和 TServerSocket,我应该改用什么?

c++ - 访问构建树中的外部文件以进行测试

c++ - C++中的模板类

c++模板来更改函数的constness

c++ - SFINAE 无法有条件地编译成员函数模板