【发布时间】:2019-12-14 18:23:59
【问题描述】:
我有一个类,其基础数据是std::vector、std::unique_ptr 和std::deque 的变体。如下代码所示。
template<class T>
class matrix2d
{
private:
typename std::variant<std::vector<T>,
std::unique_ptr<T[]>,
std::deque<T>> data;
public:
matrix2d<T>() = delete;
matrix2d<T>(size_t h, size_t w, int type) {
try {
switch (type) {
case 0:
data = std::vector<T>(h*w);
break;
case 1:
data = std::make_unique<T[]>(h*w);
break;
case 2:
data = std::deque<T>(h*w);
break;
default:
throw std::runtime_error("Unrecognized type of matrix2d class data");
}
}
catch (const std::exception& e) {
std::cerr << e.what() << std::endl;
}
}
auto operator[](size_t i) {
return (std::begin(data) + i);
}
};
int main()
{
matrix2d<int> a2d(4,5,0);
for (size_t i{}; i<4; ++i) {
for (size_t j{}; j<5; ++j) {
a2d[i][j] = 5.0;
}
}
}
我的问题如下:
是否可以创建 unique_ptr 和其他可调整大小的容器的联合?
另外,如何重载下标运算符 [] 以使类函数成为二维数组?
【问题讨论】:
-
每个问题一个问题。对于构造函数来说没有区别。等价的。
-
为了便于阅读,优先使用枚举(类)而不是简单的 int。
-
在运行时选择容器类型有什么意义?此外,您还要为每次访问支付运行时开销......:
-
@Jarod42 同意。但关键是可以在任何给定时间选择我想要的任何容器。至于运行时开销,这就是为什么我想知道是否有更好的方法来为容器分配空间。也许,使用 std::visit?
-
请注意,行上的循环偏移了一个
标签: c++ stl c++17 unions variant