一些D模板问题

时间:2009-10-23 14:48:54

标签: templates d

我最近一直在玩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 .. $];
    }
    
  3. 由于

3 个答案:

答案 0 :(得分:4)

  1. 是 - 使用template parameter specializationtemplate constraints(相当于C ++ 1x概念)。
  2. static if表示可以在编译时计算条件。函数参数不能,因此要么使用常规if要么使position成为模板参数。

答案 1 :(得分:1)

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

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

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

-OR -

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

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

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连接成一个字符串(这是一个字符数组)。您首先需要将字符编码为字符串。 <{1}}模块中的encode应该可以解决问题。

答案 2 :(得分:0)

对于2,你不能只使用正常的if语句吗?