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