如何在静态类型中自动推导文字大小?

时间:2015-04-21 16:29:15

标签: arrays string d literals

如果我初始化一个用' auto'声明的静态变量使用字符串文字 - 它的类型自动推导为immutable(char)[],这是它的大小和指向字符串内容的指针的结构。这是一个例子:

static auto str = "St";

上述数据的可能结构:

dd DstringSize
dd pstringraw ;points to string
...
db string...

但是,如果我使用常量大小初始化一个,那么只存储文字数据,并且它的大小成为该类型的一部分:

static immutable(char)[2] str = "St";

可能看起来像这样(请注意,没有明确附加任何终止字符):

db string...

所以我的问题是如何将字符串文字大小存储在类型中并自动推断它的大小,就像在' C ++'中一样。如果我使用这个结构:

static immutable(char)[] str = "Sj";

它等同于第一个,并且类型为immutable(char)[],但我希望它的类型能够按字符串文字大小自动推断,并且为immutable(char)[2]。< / p>

任何想法我该怎么做?

请注意,我是这种语言的新手。我希望你明白我的意思。但是对于代码的结果 - 我确定,因为我使用IDA Pro来检查它们。

1 个答案:

答案 0 :(得分:2)

我还没有看到这种内置语言的方法,所以这里有一些我起草的黑客攻击:

import std.traits : ForeachType;

/// Build a compile-time static array out of `val`.
auto ctStaticArray(alias val)() {
  alias T = ForeachType!(typeof(val));
  enum N  = val.length;
  return cast(T[N]) val;
}

static auto str = ctStaticArray!"st";
static auto arr = ctStaticArray!([1,2,3]);

pragma(msg, typeof(str)); // immutable(char)[2]
pragma(msg, typeof(arr)); // int[3]

我没有经常测试它,但它应该能够获取数组文字并将其转换为静态数组。 它不像只说static auto st = "st"那么干净,但至少你不必手动确定应该声明的长度。