微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C++ 特征向量在编译时为 class

如何解决C++ 特征向量在编译时为 class

我正在尝试为 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,1>
    getValue() const
    {
        return *in_;
    }

private:
    const Eigen::Matrix<double,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,1> a;
auto x = makeInputV(&a);

现场示例:https://godbolt.org/z/GqT936

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

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

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

咆哮:).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。