[英]Template arguments are invalid (unique pointer)
我正在尝试制作可动态调整大小的N维数组类。 我的模板化类具有签名ndarray<typename data_type, int dimensions>
。 要保存数组,我想使用唯一的指针类成员保存std::vector<type_t>
类型std::vector<type_t>
的模板化向量,2D std::vector<std::vector<type_t>>
的std::vector<std::vector<std::vector<type_t>>>
std::vector<std::vector<type_t>>
用于3d的std::vector<std::vector<std::vector<type_t>>>
根据维数,唯一指针将具有不同的签名。 我想让ndarray的类构造函数设置唯一指针的签名,并使用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语句是运行时分支,并且由于return语句中的表达式类型不相等而无法编译。 相反,您可以按以下方式重写它:
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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.