Для 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
должен добиться цели.