首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模板化多维阵列

模板化多维阵列
EN

Stack Overflow用户
提问于 2015-11-01 14:53:59
回答 1查看 161关注 0票数 2

我正在尝试对模板进行实验,并尝试实现模板数组,可以声明如下:

代码语言:javascript
复制
Array!(float, 3, 2, 1) myArray;

我在C++中浏览了几个这个问题的实现,但我似乎无法将它转换为D,因为我对语言(使用D)几乎没有经验。

不管怎么说,这些都是我试过的东西,不幸的是,它们都没有用:

1.编译时函数-以生成格式的代码

"DataTypeD0...Dn标识符“

代码语言:javascript
复制
import std.conv;

static string generateArray(D...)(string type, string identifier, D dimensions)
{
    string result = type;

    for(int i = 0; i < dimensions.length; i++)
    {
        result ~= "[" ~ to!(string)(dimensions[i]) ~ "]";
    }

    result ~= " " ~ identifier ~ ";";

    return result;
}

int main(string[] args)
{
    enum deb = generateArray("float", "data", 3, 2, 1);
    pragma(msg, deb);

    return 0;
}

我可以把它包装成一个简单的Array类

代码语言:javascript
复制
class Array(T, D...)
{
    mixin(generateArray(T, "Data", D));
}

但是这个代码失败了,因为:

代码语言:javascript
复制
./template_recursion.d(10): Error: variable i cannot be read at compile time
./template_recursion.d(18): Error: template instance template_recursion.expandTuple!(int, int, int) error instantiating
./template_recursion.d(18): Error: CTFE failed because of previous errors in expandTuple

2.递归模板--正如前面所述,我在C++中看到了这方面的实现,但我似乎无法将这些语句转换为D编译器所接受的内容。

Variadic Templates in C++

代码语言:javascript
复制
template<class T, unsigned ... RestD> struct array;

template<class T, unsigned PrimaryD > 
  struct array<T, PrimaryD>
{
  typedef T type[PrimaryD];
  type data;
  T& operator[](unsigned i) { return data[i]; }

};

template<class T, unsigned PrimaryD, unsigned ... RestD > 
   struct array<T, PrimaryD, RestD...>
{
  typedef typename array<T, RestD...>::type OneDimensionDownArrayT;
  typedef OneDimensionDownArrayT type[PrimaryD];
  type data;
  OneDimensionDownArrayT& operator[](unsigned i) { return data[i]; }
};
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-01 15:19:48

第一个代码,使用混合器:

dimensions是一个AliasSeq (又名TypeTuple,因为它包含整数),它只能用编译时已知的值进行索引,而您的运行时循环并不提供这些值。

但是,您可以使用编译时foreach循环,如下所示:

代码语言:javascript
复制
foreach(auto dimension; dimensions) {
    result ~= "[" ~ to!(string)(dimensions[i]) ~ "]";
}

第二个代码,使用模板:

代码语言:javascript
复制
template MultiArray(BaseType, Dimentions...) {
    static if(Dimensions.length == 0)
        alias MultiArray = BaseType;
    else
        alias MultiArray = MultiArray!(BaseType[Dimensions[0]], Dimensions[1..$];
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33463497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档