6

我最近一直在玩 D 语言,我有一个关于模板的快速问题。

我将字符和字符串插入到代码中的现有字符串中,并提出了这个函数:

string insert(T)(string s1, T s2, uint position) {
    return s1[0 .. position] ~ s2 ~ s1[position .. $];
}

现在,我有几个问题。

  1. 我可以限制 s2 参数允许的类型(我只想要 char、wchar、dchar 等及其各自的数组值)吗?

  2. 如果位置 arg 为 0,是否有某种方法可以定义模板以自动知道要添加?像这样的东西(不编译,但给出了一般的想法):

    string insert(T)(string s1, T s2, uint position) {
      static if (position == 0)
        return "" ~ s2 ~ s1;
      else
        return s1[0 .. position] ~ s2 ~ s1[position .. $];
    }
    

谢谢

4

3 回答 3

4
  1. 是 - 使用模板参数特化模板约束(相当于 C++1x 概念)。
  2. static if意味着可以在编译时计算条件。函数参数不能,所以要么使用常规参数,要么if制作position模板参数。
于 2009-10-23T15:47:03.077 回答
1

对于 1,实际上有两个地方可以限制允许的类型。

首先是方法选择之前。如果一个符号解析为多个方法,编译器将尝试消除尽可能多的方法,然后再决定使用哪一个。模板约束(仅限 D2)和专业化在此阶段起作用。例如:

string insert(T)(string s1, T s2, uint position) if(isSomeChar!T) // D2 only

-或者-

string insert(T : dchar)(string s1, T s2, uint position) // D1 or D2

另一种是方法选择之后。这是编译器已经决定使用这种特定方法的地方。您可以使用静态断言来做到这一点。请注意,这不会导致编译器“哦;我应该尝试寻找不同的重载!”;它只会放弃。

string insert(T)(string s1, T s2, uint position)
{
    static if( !isSomeChar!(T) )
    {
        pragma(msg, "Error: insert(T): T must be a character type.");
        static assert(false);
    }
    ...
}

另一件事:据我所知,您**不能*简单地将 wchars 和 dchars 连接成一个字符串(这是一个字符数组)。您首先需要将字符编码为字符串。 encodestd.utf模块中应该可以解决问题。

于 2009-10-24T03:46:08.820 回答
0

至于2,你不能只使用普通的if语句吗?

于 2009-10-23T15:04:03.523 回答