如何解决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 举报,一经查实,本站将立刻删除。