class 的 C++ 特征向量在编译时推断向量大小

C++ Eigen Vector infer vector size at compile time for class

我正在尝试为 Eigen::Matrix 制作包装器 class。它应该接受一个指向静态大小特征向量(1 行矩阵)的指针,并且在调用 getValue() 函数时应该 return 一个副本。这是我目前拥有的

template<std::size_t N>
class InputV
{
public:

    InputV(const Eigen::Matrix<double, N, 1>* in) : in_(in)
    {

    }

    Eigen::Matrix<double, N, 1>
    getValue() const
    {
        return *in_;
    }

private:
    const Eigen::Matrix<double, N, 1>* in_;
};

TEST_CASE("dummy")
{
    Eigen::Matrix<double, 10, 1> a;
    
    InputV<10> in(&a);
}

但是,我需要明确地告诉它两次大小,一次是在源指针的初始化期间,第二次是在创建 InputV 包装器时 class。有没有办法让 InputV 推断大小 N,这样我就不必指定它两次?

谢谢!

如果您使用的是 C++17,则可以使用 class template argument deduction(和演绎指南,但在这种情况下不需要它们):

Eigen::Matrix<double, 10, 1> a;

auto x = InputV(&a);
InputV y(&a);

如果您使用的是较旧的 C++ 版本(即 C++11 或 C++14),则可以使用辅助函数。这是有效的,因为函数可以在所有 C++ 版本中推导出模板参数:

template <std::size_t N>
InputV<N> makeInputV (Eigen::Matrix<double, N, 1> const * m) {
  return InputV<N>(m);
}

Eigen::Matrix<double, 10, 1> a;
auto x = makeInputV(&a);

实例:https://godbolt.org/z/GqT936

编辑: 有点讨厌:如果将 nullptr 作为参数传递给 class 没有意义,那么不允许。 InputV 构造函数的签名告诉我传入 Eigen::Matrix 是可选的,传入 nullptr 完全没问题。

如果不是这种情况,请使您的代码必须传入某些内容:InputV (Eigen::Matrix<double, N, 1> const &)。 IE。使用引用而不是指针。

更差的解决方案是记录您不应传入 nullptr(并使文档保持最新状态,并确保使用该代码的人都能阅读它,以及...)。但为什么一开始就允许它发生呢?

吐槽一下:).