2016-10-21 9 views
2

の初期化子リストの構文の並べ替えを実装しようと、私は初期化子リストの初期化に似ていることを好むだろう。は私が固有のカンマ初期化構文を好き固有マトリックス

私は自分自身でこのような何かを実装しようとしましたが、私は解決することができないんだけど問題に実行しました。

  1. コンストラクタは、(2)と呼ばれることはありませんし、私ドン: - 6しかし、それは(少なくとも)二つの問題ました

    #include <iostream> 
    #include <Eigen/Dense> 
    
    template <int Rows= Eigen::Dynamic, int Cols= Rows> 
    class MyMatrix: public Eigen::Matrix<double,Rows,Cols> 
    { 
    private: 
        using Matrix= Eigen::Matrix<double,Rows,Cols>; 
    
    public: 
        MyMatrix(): Matrix() { 
        std::cout << "MyMatrix()\n"; 
        if /* constexpr */ (Rows!=Eigen::Dynamic) Matrix::setZero(); } 
    
        template <typename Derived> 
        MyMatrix(const Eigen::MatrixBase<Derived> &Other): Matrix(Other) // (2) 
        { std::cout << "MyMatrix(const MatrixBase<Derived> &Other)\n"; } 
    
        template <typename TFirst,typename... TRest/*,typename= enable_if_t<NoIdea::value>*/> 
        MyMatrix(TFirst &&First,TRest &&... Rest) { *this << First, (Rest, ...); } 
    }; 
    
    int main() 
    { 
    MyMatrix<3> Mat1= MyMatrix<3>::Identity(); 
    MyMatrix<3> Mat2= { MyMatrix<3>::Identity() }; 
    MyMatrix<3> Mat3= { 1.0, 0.0, 0.0, // Runtime error 
            0.0, 1.0, 0.0, 
            0.0, 0.0, 1.0 }; 
    MyMatrix<3> Mat4= MyMatrix<3>::Identity()+MyMatrix<3>::Ones(); 
    MyMatrix<3> Mat5= {}; 
    } 
    

    このコードは、グラムでコンパイル++:

    私のアプローチは以下のとおりです。コンパイラに適切なオブジェクトを選択させる方法を知っています。

  2. 私は、アサーションがactualy initialitacionリスト(Too few coefficients passed to comma initializer (operator<<))を使用していますMyMatrixインスタンスに対して失敗し得ます。私が望むように折り畳み式がうまくいかないようです。

任意の助けもいただければ幸いです。

+0

を、私はあなたが(HTTPS [ '3のルール']にいくつかの研究を行うために必要があると思いますあなたがポインタを扱っていない間、あなたは代入演算子を使用しようとしています... – UKMonkey

+0

@UKMonkey私はこれを何も定義しませんでした。デフォルトで生成されたものは間違った動作を引き起こすでしょうか? – metalfox

+0

あなたのコンストラクタ(2)を誤って読んでください。 いずれの場合でも、呼び出されないのは、代入演算子または移動演算子のどちらかを使用するためです。変数は()ではなく、 "="で作成されます。 – UKMonkey

答えて

0

私はちょうど倍式のエラーについて実現しています。読み込みする必要があります。

(*this << First),...,Rest; 

EDIT:

template <typename TFirst,typename TSecond,typename... TRest> 
MyMatrix(TFirst &&First,TSecond &&Second,TRest &&... Rest) 
    { ((*this << First, Second), ... , Rest); } 

残念ながら、このコードがありません:私は、単一の要素とのinit-リストのない興味を持っているのでは、以下の解決策は、コンストラクタの曖昧さの問題を回避g ++ - 6(おそらくbug 68377のため)でコンパイルされませんが、clang ++ - 3.8ではそうです。今

私が書くことができます:

MyMatrix<3> m= { MyMatrix<2,2>::Ones(), MyMatrix<2,1>::Zero(), 
       MyMatrix<1,2>::Zero(), 0.0 }; 

の代わり://en.wikipedia:

MyMatrix<3> m= (MyMatrix<3>() << MyMatrix<2,2>::Ones(), MyMatrix<2,1>::Zero(), 
            MyMatrix<1,2>::Zero(), 0.0).finished(); 
+0

'MyMatrix <3> MatZeros;'は動作しませんか? –

+0

@AviGinsburgはい。します。根本的な問題は、私の可変的なコンストラクタが引数を取るすべての値の初期化を「食べる」ということです。 – metalfox

関連する問題