Eigen의 쉼표 초기화 구문이 마음에 들지만 이니셜 라이저 목록 초기화와 비슷합니다.Eigen Matrix에 대한 일종의 이니셜 라이저 목록 구문 구현 시도
나는 이처럼 뭔가를 구현하려고 시도했지만 해결할 수없는 문제가 발생했습니다.
- 생성자 (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로 컴파일 ++ :
내 접근 방식은 다음과 같다 컴파일러가 적절한 객체를 위해 그것을 선택하도록 장려하는 방법을 알지 못한다.
- 실제로는 initialitacion 목록 (
Too few coefficients passed to comma initializer (operator<<)
)을 사용하는MyMatrix
인스턴스에 대한 어설 션이 실패합니다. 내가 원하는 것처럼 fold 표현이 작동하지 않는 것 같습니다.
모든 도움을 주시면 감사하겠습니다.
을 당신이 (HTTPS에서 [ '3의 법칙']에 몇 가지 조사를 할 필요가 있다고 생각 .org/wiki/Rule_of_three_ (C % 2B % 2B_programming)) 포인터를 다루지 않는 동안 할당 연산자를 사용하려고합니다 ... – UKMonkey
@UKMonkey이 '3'을 정의하지 않았습니다. 기본 생성 된 것들은 잘못된 행동을 일으킬까요? – metalfox
귀하의 생성자를 잘못 읽었습니다 (2) 죄송합니다. 어쨌든 호출되지 않는 이유는 할당 연산자 또는 이동 연산자를 사용하기 때문입니다. 귀하의 변수 중 어느 것도()와 함께 작성되지 않고 "="로 작성됩니다. – UKMonkey