Некоторые вопросы о шаблоне D

На самом деле много поточная обработка не масштабируема и трудна отладить, таким образом, она не должна использоваться в любом случае, если можно избежать его. Существует немного случаев, где это обязательно: когда производительность на много ЦП имеет значение, или когда Вы имеете дело с сервером, которые имеют много клиентов, требующихся много времени для ответа.

В любых других случаях, можно использовать альтернативы, такие как очередь + задания крона или иначе.

6
задан Kornel 26 October 2009 в 21:33
поделиться

3 ответа

  1. Да - с использованием либо специализации параметров шаблона , либо ограничений шаблона (эквивалент концепций C ++ 1x).
  2. static if означает, что условие может быть вычислено во время компиляции. Параметр функции не может быть, поэтому либо используйте обычный if , либо сделайте позицию параметром шаблона.
4
ответ дан 17 December 2019 в 04:48
поделиться

Что касается 2, разве вы не можете просто использовать обычный оператор if?

0
ответ дан 17 December 2019 в 04:48
поделиться

Для 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 в строку (которая представляет собой массив символов). Сначала вам нужно будет закодировать символ в строку. encode в модуле std.utf должен помочь.

1
ответ дан 17 December 2019 в 04:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: