具有特定于枚举的实现和共享功能 (CRTP) 的类模板
Class template with enum specific implementation and shared functionality (CRTP)
我想设计一个允许指定内存管理方法的Matrix
类,即
Matrix<Allocator::vector, int> mv(2, 2);
Matrix<Allocator::unique_pointer, int> mu(2, 2);
mv(1, 1) = 1;
mu(1, 2) = 1;
尽管内存策略不同,但mv
和mu
彼此兼容(即当我重载"+"运算符时(。
我从具有共享功能的类模板专用化中找到了非常好的帮助,这些功能对 n 维向量类执行相同的操作。
using dim_t = std::pair<size_t, size_t>;
enum class Allocator { vector, raw_pointer, unique_pointer };
template <typename T>
class MatrixBase {
public:
MatrixBase() : MatrixBase(0, 0){};
MatrixBase(size_t m, size_t n) : dim_(m, n){};
size_t rows() const;
virtual T& at(size_t i, size_t j);
private:
dim_t dim_;
};
template <typename T>
size_t MatrixBase<T>::rows() const {
return dim().first;
}
template <Allocator A, typename T>
class Matrix : public MatrixBase<T> {};
template <typename T>
class Matrix<Allocator::vector, T> : public MatrixBase<T> {
private:
std::vector<T> data_;
};
template <typename T>
T& Matrix<Allocator::vector, T>::at(size_t i, size_t j) {
return data_[i * rows() + j];
}
template <typename T>
class Matrix<Allocator::unique_pointer, T> : public MatrixBase<T> {
private:
std::unique_ptr<T[]> data_;
};
template <typename T>
T& Matrix<Allocator::unique_pointer, T>::at(size_t i, size_t j) {
return data_[i * rows() + j];
}
不幸的是,编译器抱怨
./matrix.hpp:100:34: error: out-of-line definition of 'at' does not match any declaration in 'Matrix<linalg::Allocator::vector,
type-parameter-0-0>'
T& Matrix<Allocator::vector, T>::at(size_t i, size_t j) {
^
./matrix.hpp:103:20: error: use of undeclared identifier 'rows'
return data_[i * rows() + j];
我假设错误源于
template <typename T>
class Matrix<Allocator::vector, T> : public MatrixBase<T> {
private:
std::vector<T> data_;
};
我该如何解决这个问题?
我已经修复了你的代码。给你:
using dim_t = std::pair<size_t, size_t>;
enum class Allocator { vector, raw_pointer, unique_pointer };
template <typename T>
class MatrixBase {
public:
MatrixBase() : MatrixBase(0, 0){};
MatrixBase(size_t m, size_t n) : dim_(m, n){};
size_t rows() const;
virtual T& at(size_t i, size_t j);
private:
dim_t dim_;
};
template <typename T>
size_t MatrixBase<T>::rows() const {
return dim_.first;
}
template <Allocator A, typename T>
class Matrix : public MatrixBase<T> {};
template <typename T>
class Matrix<Allocator::vector, T> : public MatrixBase<T> {
public:
T &at(size_t i, size_t j);
private:
std::vector<T> data_;
};
template <typename T>
T& Matrix<Allocator::vector, T>::at(size_t i, size_t j) {
return data_[i * this->rows() + j];
}
template <typename T>
class Matrix<Allocator::unique_pointer, T> : public MatrixBase<T> {
public:
T &at(size_t i, size_t j);
private:
std::unique_ptr<T[]> data_;
};
template <typename T>
T& Matrix<Allocator::unique_pointer, T>::at(size_t i, size_t j) {
return data_[i * this->rows() + j];
}
首先,如果您重写了一个方法 您必须在派生类中声明它。 其次,默认情况下无法将rows()
函数解析为成员。
将定义移到里面将解决问题。此问题是由于范围界定造成的。
template <typename T>
class Matrix<Allocator::vector, T> : public MatrixBase<T> {
public: // or private:
T& at(size_t i, size_t j) {
return data_[i * MatrixBase<T>::rows() + j];
}
private:
std::vector<T> data_;
};
考虑以下示例
class P {
public:
virtual int test();
};
class C : public P {
};
int C::P:: test() { // if you omit P, it will not compile
return 21;
}
或者你可以在C
内重新声明它,这样它就会在C
的范围内。
相关文章:
- 如何用共享库替换可执行C++程序的功能?
- 具有特定于枚举的实现和共享功能 (CRTP) 的类模板
- 我对C 中共享指针列表进行排序的功能未完成类型
- 共享_ptr中多功能数组的类型是什么
- 共享库中静态功能成员的破坏顺序
- 共享类时如何隐藏成员功能文件
- 为什么我的按钮类项目共享相同的lambda功能
- 您如何共享Java功能而不提供其他源代码
- 如何标识其功能当前正由可执行文件执行的共享库
- 在C 中使用DLSYM加载共享对象功能
- C 模板功能,相同类型,多个实例:共享一个相同的代码副本?即使在不同的CPP/对象文件中
- 应在共享库中避免静态成员功能
- 在多个类成员功能上共享模板参数
- 通过功能提升共享内存中的C++结构
- 在多个功能中共享随机引擎
- 共享库中的回溯功能
- C++共享库导出功能
- 可以两个类共享一个好友功能
- 任何可在facebook上共享/发送邮件的cocos2d-X功能
- 在C语言的不同功能中共享打开的文本文件