の初期化子リストの構文の並べ替えを実装しようと、私は初期化子リストの初期化に似ていることを好むだろう。は私が固有のカンマ初期化構文を好き固有マトリックス
私は自分自身でこのような何かを実装しようとしましたが、私は解決することができないんだけど問題に実行しました。
- コンストラクタは、(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= {}; }
このコードは、グラムでコンパイル++:
私のアプローチは以下のとおりです。コンパイラに適切なオブジェクトを選択させる方法を知っています。
- 私は、アサーションがactualy initialitacionリスト(
Too few coefficients passed to comma initializer (operator<<)
)を使用していますMyMatrix
インスタンスに対して失敗し得ます。私が望むように折り畳み式がうまくいかないようです。
任意の助けもいただければ幸いです。
を、私はあなたが(HTTPS [ '3のルール']にいくつかの研究を行うために必要があると思いますあなたがポインタを扱っていない間、あなたは代入演算子を使用しようとしています... – UKMonkey
@UKMonkey私はこれを何も定義しませんでした。デフォルトで生成されたものは間違った動作を引き起こすでしょうか? – metalfox
あなたのコンストラクタ(2)を誤って読んでください。 いずれの場合でも、呼び出されないのは、代入演算子または移動演算子のどちらかを使用するためです。変数は()ではなく、 "="で作成されます。 – UKMonkey