【发布时间】:2019-02-03 02:20:10
【问题描述】:
我有一个包含一些特征矩阵作为成员的类层次结构,但它们的大小取决于派生类。我希望能够在基类中声明矩阵,但使用派生类的大小。我以为我可以为此使用 CRTP,但我不确定我是否正确使用它。这是我尝试过的代码
template<typename T>
class Base {
public:
const int matSize = static_cast(T*)(this)->_matSize;
Eigen::Matrix<int, matSize, mastSize> Mat = Eigen::Matrix<int, matSize, matSize>::Zero();
virtual void print() { std::cout << Mat << std::endl; };
};
class Derived1 : public Base<Derived1>{
public:
const int _matSize = 3;
};
class Derived2 : public Base<Derived2>{
public:
const int _matSize = 4;
};
int main(){
Derived1 d1;
d1.print(); // print a 3x3 zero matrix
Derived2 d2;
d2.print(); // print a 4x4 zero matrix
std::cin.get();
return 0;
}
但是,这不起作用。有没有办法实现这样的目标?
编辑:
这样做的主要原因是我有一些函数可以做一些矩阵代数,无论大小如何,它都可以工作。所以我希望能够在不同派生类的对象上调用该函数,并且能够使用相同的函数,而不是为每个矩阵大小使用单独的函数。
还有一个接口,任何 Base 类型的对象都将有一个矩阵 Mat,其大小将取决于它是从哪个派生类 Base 创建的。
【问题讨论】:
-
你必须学习关键字constexpr。
-
能否请您详细说明或提供参考示例?我四处寻找 constexpr 在这种情况下的用法,但也许我不太了解 constexpr。
-
我很好奇您为什么以这种方式使用 CRTP。您唯一提供的是矩阵大小,它是
Eigen::Matrix的模板参数,您可以简单地将d1声明为Eigen::Matrix<int,3,3>::Zero()。你遗漏了什么吗?