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

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

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 包装类时。有没有办法让 InputV 推断大小 N,所以我不必指定它两次?

谢谢!

回答

如果您使用的是 C++17,您可以使用类模板参数推导(和推导指南,但在这种情况下您不需要它们):

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

编辑:有点讨厌:如果将nullptras 参数传递给您的类没有意义,则不允许它。您的InputV构造函数的签名告诉我传入 anEigen::Matrix是可选的,并且传入nullptr非常好。

如果不是的话,让你的代码,这样的东西在传递:InputV (Eigen::Matrix<double, N, 1> const &)。即使用引用而不是指针。

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

咆哮:)。


以上是C++特征向量在类的编译时推断向量大小的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>