На самом деле много поточная обработка не масштабируема и трудна отладить, таким образом, она не должна использоваться в любом случае, если можно избежать его. Существует немного случаев, где это обязательно: когда производительность на много ЦП имеет значение, или когда Вы имеете дело с сервером, которые имеют много клиентов, требующихся много времени для ответа.
В любых других случаях, можно использовать альтернативы, такие как очередь + задания крона или иначе.
static if
означает, что условие может быть вычислено во время компиляции. Параметр функции не может быть, поэтому либо используйте обычный if
, либо сделайте позицию
параметром шаблона. Что касается 2, разве вы не можете просто использовать обычный оператор if?
Для 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
должен помочь.