2016-10-21 1 views
2

Eigen의 쉼표 초기화 구문이 마음에 들지만 이니셜 라이저 목록 초기화와 비슷합니다.Eigen Matrix에 대한 일종의 이니셜 라이저 목록 구문 구현 시도

나는 이처럼 뭔가를 구현하려고 시도했지만 해결할 수없는 문제가 발생했습니다.

  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= {}; 
    } 
    

    이 코드는 g로 컴파일 ++ :

    내 접근 방식은 다음과 같다 컴파일러가 적절한 객체를 위해 그것을 선택하도록 장려하는 방법을 알지 못한다.

  2. 실제로는 initialitacion 목록 (Too few coefficients passed to comma initializer (operator<<))을 사용하는 MyMatrix 인스턴스에 대한 어설 션이 실패합니다. 내가 원하는 것처럼 fold 표현이 작동하지 않는 것 같습니다.

모든 도움을 주시면 감사하겠습니다.

+0

을 당신이 (HTTPS에서 [ '3의 법칙']에 몇 가지 조사를 할 필요가 있다고 생각 .org/wiki/Rule_of_three_ (C % 2B % 2B_programming)) 포인터를 다루지 않는 동안 할당 연산자를 사용하려고합니다 ... – UKMonkey

+0

@UKMonkey이 '3'을 정의하지 않았습니다. 기본 생성 된 것들은 잘못된 행동을 일으킬까요? – metalfox

+0

귀하의 생성자를 잘못 읽었습니다 (2) 죄송합니다. 어쨌든 호출되지 않는 이유는 할당 연산자 또는 이동 연산자를 사용하기 때문입니다. 귀하의 변수 중 어느 것도()와 함께 작성되지 않고 "="로 작성됩니다. – UKMonkey

답변

0

나는 접힌 식의 오류에 대해 깨달았습니다. 읽어야합니다

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

편집 :

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

불행하게도,이 코드는 않습니다 : 나는 하나의 요소로 초기화-목록에없는 관심 때문에는 다음과 같은 솔루션은 생성자의 모호성 문제를 피할 수 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

관련 문제