gpt4 book ai didi

c++ - CRTP:确定基类函数中的派生类类型以允许代码重用

转载 作者:行者123 更新时间:2023-12-01 14:24:49 34 4
gpt4 key购买 nike

假设我有一个用于矩阵的 CRTP 模板类

template<class T, class Derived>
class MatrixBase{
private:
//...

public:
Derived some_function(const Derived &other){
Derived& self = (Derived&)*this; // In my application I cant use static_cast.

// Some calculations..., which will determine the below
// defined variables "some_number_of_rows" and "some_number_of_cols"

// If Derived = DynamicMatrix<T>, then result should be declared as:
DynamicMatrix<T> result(some_number_of_rows, some_number_of_cols);

// while if Derived = StaticMatrix<T, Rows, Cols>, then result should be declared as:
StaticMatrix<T, some_number_of_rows, some_number_of_cols> result;

// Perform some more calculations...

return result;
}
};

template<class T>
class DynamicMatrix{
private:
size_t n_rows, n_cols;
T *data;
public:
DynamicMatrix(const size_t n_rows, const size_t n_cols);
// ...
};

template<class T, int Rows, int Cols>
class StaticMatrix{
private:
size_t n_rows = Rows, n_cols = Cols;
T data[Rows * Cols];
public:
StaticMatrix() {}
// ...
};

如何检查 MatrixBase::some_function(const Derived &other) 中的派生类类型在两个派生类中使用此基函数?,从而避免在这些类中分别进行重新定义/覆盖/代码重复的需要。在这种情况下,它基本上只是 result 的声明。需要我检查派生类类型的矩阵,因为声明是不同的,具体取决于它是固定大小矩阵还是动态矩阵。也欢迎使用类型检查以外的其他解决方案。

注意:由于我的应用程序的性质,我无法使用标准功能。

编辑:some_number_of_rowssome_number_of_cols在示例函数中通常不是 constexpr,因为它们取决于对象矩阵的函数和大小。例如 transpose函数,结果必须具有维度 <Derived.n_cols, Derived.n_rows ,在列式点积的情况下,<1, Derived.n_cols> .

最佳答案

这是一个具有挑战性的问题。基本上,在 StaticMatrix 的情况下,some_number_of_rowssome_number_of_cols 必须 constexpr,并且 <在 DynamicMatrix 的情况下,em>不能 constexpr

一种解决方案是将新矩阵的创建委托(delegate)给派生类。它将按照 constexpr 或不作为 constexpr 进行大小计算,以适用于它的为准。

另一种是在 CRTP 类中进行两次大小计算,一次作为 constexpr,一次作为非 constexpr,并将两个结果传递给派生对象创建函数: constexpr 作为模板参数传递,非 constexpr 作为常规参数传递。创建函数专用于静态和动态矩阵。静态版本忽略非 constexpr 参数,反之亦然。

关于c++ - CRTP:确定基类函数中的派生类类型以允许代码重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63534583/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com