模板参数无效(唯一指针)
Template arguments are invalid (unique pointer)
我正在尝试动态调整大小的n维数组类。我的模板类的签名是ndarray<typename data_type, int dimensions>
。为了保存数组,我想使用一个唯一的指针类成员来保存类型为std::vector<type_t>
(1D), std::vector<std::vector<type_t>>
(2D), std::vector<std::vector<std::vector<type_t>>>
(3d)等的模板向量…
唯一指针将根据维数的不同具有不同的签名。我想让narray的类构造函数设置唯一指针的签名,并使用new
来创建新向量,但我需要将auto
成员变量设置为不工作的成员变量类型的向量。我目前的方法是使用一个模板化函数,它返回数组需要的类型的对象,template<typename data_type> auto dimension_helper(int dimensions)
,然后设置像std::unique_ptr<decltype(<data_type>dimension_helper(dimens))> array
这样的唯一指针签名。这也不起作用,给我错误模板参数1无效,模板参数2在唯一指针内无效。
我能做些什么来使我现有的代码工作,或者是否有更好的方法以类似的方式处理问题?
代码示例头
#ifndef ND_H_
#define ND_H_
#include <cstring>
#include <vector>
#include <memory>
namespace NdArray{
//use the following for dimension types
template<typename T>
using d1 = std::vector<T>;
template<typename T>
using d2 = std::vector<d1<T>>;
template<typename T>
using d3 = std::vector<d2<T>>;
template<typename T>
using d4 = std::vector<d3<T>>;
template<typename T>
using d5 = std::vector<d4<T>>;
template<typename data_type>
auto dimension_helper(int dim);
template<typename data_type,int dimensions>
class ndarray{
int dims;
std::unique_ptr<std::vector<int>> xsub_spans;
public:
ndarray();
~ndarray();
std::unique_ptr<decltype(<data_type>dimension_helper(dimensions))> array;
template<typename dat_type, int dim>
friend std::ostream& operator<<(std::ostream& , ndarray<dat_type, dim>&);
};
}
#endif
到目前为止的定义
#include "nd.h"
using namespace NdArray;
template<typename data_type, int dimensions>
ndarray<data_type, dimensions>::ndarray(){
dims = dimensions;
array = new <data_type>dimension_helper(dimensions);
}
template<typename data_type>
auto dimension_helper(){
switch (dims) {
case 1 : {
d1<data_type> type;
return type;
break;
}
case 2 : {
d2<data_type> type;
return type;
break;
}
case 3 : {
d3<data_type> type;
return type;
break;
}
case 4 : {
d4<data_type> type;
return type;
break;
}
case 5 : {
d5<data_type> type;
return type;
break;
}
}
}
模板的参数列表在模板名之后,所以:
dimension_helper<data_type>(dimensions)
不是<data_type>dimension_helper(dimensions)
但是,您的"维度助手"没有机会工作,因为switch语句是运行时分支,并且由于返回语句中的表达式类型不相等而无法编译。相反,您可以这样重写它:
template <typename T>
struct identity { using type = T; };
template <typename T, std::size_t D>
struct dimension_helper : identity<std::vector<typename dimension_helper<T, D-1>::type>> {};
template <typename T>
struct dimension_helper<T, 0> : identity<T> {};
template <typename T, std::size_t D>
using dimension_helper_t = typename dimension_helper<T, D>::type;
并声明指针为:
std::unique_ptr<dimension_helper_t<data_type, dimensions>> array;
相关文章:
- 何时在引用或唯一指针上使用移动语义
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- 如何更改唯一指针向量的可见性
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- C++尝试深度复制唯一指针时出现内存访问冲突
- 使用 RTTI 克隆唯一指针的向量
- 为什么我无法创建唯一指针
- 如何将唯一指针的 std::vector 转换为原始指针的 std::span?
- 将唯一指针的指针传递给采用双指针的函数
- 在什么情况下,需要共享智能指针而无法使用唯一指针?
- C++唯一指针的向量
- 对带有唯一指针的 std::thread 使用类成员函数时出现编译错误
- 指向基类的唯一指针
- 添加要映射的对象的唯一指针
- 智能指针(唯一指针)和引用
- 唯一指针是否在堆或堆栈上分配内存?
- 尝试设置唯一指针布尔数组的值时BAD_ACCESS错误
- 使用唯一指针调用函数会使我的程序崩溃
- 将唯一指针插入std::映射