我有不同类型的矩阵,我想创建一个广义子矩阵引用类 MatrixRef
。
矩阵只实现了一些成员,例如 row(i)
、column(i)
、diagonal()
等,当然定义相应的类型row_vector
等
On MatrixRef
我想,如果模板参数 C 没有定义,例如col_vector
,MatrixRef
也没有定义 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/