代码之家  ›  专栏  ›  技术社区  ›  German Capuano

以特征类型为参数的函数的返回类型不明确

  •  5
  • German Capuano  · 技术社区  · 7 年前

    template <typename DerivedA,typename DerivedB>
    inline **something** mult(const MatrixBase<DerivedA>& p1,
                              const MatrixBase<DerivedB>& p2)
      {
      return p1*p2;
      }
    

    我假设有一些阶级,比如说 productOp

    template <typename Derived>
    **something** foo(const MatrixBase<Derived>& p1))
      {
      **something** p2;
      p2.setZero();
      while(p2(0,0) < 1)
        p2 += p1; 
      return p2;
      }
    

    我的问题是:

    1. 第二个例子可能吗?
    2. 我如何计算这样的操作类型 p1*p2
    3 回复  |  直到 7 年前
        1
  •  3
  •   ggael    7 年前

    在第一个示例中,返回 auto will运行良好,因为它是一个不引用任何局部临时变量的单个表达式。

    typename Derived::PlainObject p2;
    p2.resizeLike(p1);
    

    返回类型为 typename Derived::PlainObject

        2
  •  1
  •   NathanOliver    7 年前

    如果文档不喜欢,您可以做一件事 auto 对于返回类型为,请使用尾随返回类型并获取其类型 DerivedA * DerivedB .那看起来像

    inline auto mult(...) -> MatrixBase<decltype(std::declval<DerivedA>() * std::decval<DerivedB>())>
    
        3
  •  1
  •   chtz    7 年前

    template<class DerivedA, class DerivedB>
    Eigen::Matrix<typename Eigen::ScalarBinaryOpTraits<typename DerivedA::Scalar, typename DerivedB::Scalar>::ReturnType, 
                  DerivedA::RowsAtCompileTime, DerivedB::ColsAtCompileTime>
    mult(const Eigen::MatrixBase<DerivedA>& p1, const Eigen::MatrixBase<DerivedB>& p2)
    {
        return p1*p2;
    }
    

    ScalarBinarayOpTraits 用于确定是否可以组合两种不同的标量类型(例如。, double std::complex<double>

    示例用法:

    Eigen::Matrix3Xcd M1 = mult(Eigen::Matrix3d(), Eigen::Matrix3Xcd(3,20));
    

    如果将临时对象传递给 mult auto 变量,例如:

    double *someData = ...;
    Eigen::MatrixXd someMatrix = ...; 
    auto result = mult(Eigen::Matrix3d::Map(someData), someMatrix.topLeftCorner<3,4>());
    

    对于第二个例子,正如ggael所写 typename Derived::PlainObject 就足够了。你可以使用 p2.setZero(p1.rows(), p2.cols()); to initialize