3

さまざまな種類の行列があり、一般化された部分行列参照クラスを作成したいと考えていますMatrixRef

row(i)マトリックスは、column(i)、などのいくつかのメンバーのみを実装し、diagonal()もちろん対応する型row_vectorなどを定義します。

MatrixRefが欲しいのは、テンプレートパラメータ C が定義されていない場合、例えば もcol_vector定義されMatrixRefていないcol_vectorことです。または回避策として定義しvoidます。

関数メンバーについては、有効な解決策を見つけましたが、typedefs についてはそうではありませんでした。

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

1 に答える 1

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

他のオプションの型エイリアスについても同じです。

于 2013-04-13T14:16:55.890 に答える