Как использовать «Конструкторы шаблонов» в D? - PullRequest
10 голосов
/ 02 июля 2011

Документация шаблона для D включает небольшой раздел, который называется «Конструкторы шаблонов». В этом разделе нет ни примера, ни обширной документации.

Я пытаюсь использовать эту функцию (я знаю, что я мог бы просто использовать «статический конструктор», но у меня есть причины предпочесть конструктор шаблона).

В частности, я пытаюсь сгенерировать несколько хэшей во время компиляции. Вот моя попытка:

struct MyHash
{
    uint value;

    this(uint value)
    {
        this.value = value;
    }

    this(string str)()
    {
        enum h = myHashFunc(str);
        return MyHash(h);
    }
}

uint myHashFunc(string s)
{
    // Hashing implementation
    return 0;
}

int main(string[] str)
{
    MyHash x = MyHash!"helloworld";
    return 0;
}

Это не компилируется с DMD 2.053:

x.d(10): Error: template x.MyHash.__ctor(string str) conflicts with constructor x.MyHash.this at x.d(5)

Жалуется на первого конструктора. После удаления:

x.d(20): Error: template instance MyHash is not a template declaration, it is a struct

Что довольно логично, учитывая, что используемый мной синтаксис будет таким же, как если бы MyHash был структурой шаблона.

Итак, кто-нибудь знает, как я могу объявить и вызвать "конструктор шаблона"?

1 Ответ

7 голосов
/ 02 июля 2011

Я спрашивал об IRC, и, насколько мы можем судить, он никогда не был реализован для D1, поэтому мы предполагаем, что он все еще не реализован.Кроме того, в языке программирования D нет упоминания об этой функции, так что все дело в воздухе.

На вашем месте я бы отправилошибка в документации.

...