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
编辑:有点讨厌:如果将nullptr
as 参数传递给您的类没有意义,则不允许它。您的InputV
构造函数的签名告诉我传入 anEigen::Matrix
是可选的,并且传入nullptr
非常好。
如果不是的话,让你的代码,这样的东西在传递:InputV (Eigen::Matrix<double, N, 1> const &)
。即使用引用而不是指针。
更差劲的解决方案是记录您不应该传入nullptr
(并保持文档最新,并确保使用代码的人阅读它,以及......)。但为什么一开始就允许它发生呢?
咆哮:)。