gpt4 book ai didi

C++ Eigen Vector 在编译时推断类的 vector 大小

转载 作者:行者123 更新时间:2023-12-02 18:57:24 26 4
gpt4 key购买 nike

我正在尝试为 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,则可以使用 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 (并保持文档最新,并确保使用代码的人阅读它,以及......)。但为什么一开始就允许它发生呢?

咆哮:)。

关于C++ Eigen Vector 在编译时推断类的 vector 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66014169/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com