Недавно я задал этот вопрос о том, как моделировать классы типов в D, и предложил способ сделать это с помощью специализации шаблонов.
] Я обнаружил, что D не распознает специализацию шаблона в другом исходном файле. Так что я не мог просто сделать специализацию в файле, не включенном в файл, в котором определена универсальная функция. Чтобы проиллюстрировать это, рассмотрим следующий пример:
//template.d
import std.stdio;
template Generic(A) {
void sayHello() {
writefln("Generic");
}
}
void testTemplate(A)() {
Generic!A.sayHello();
}
//specialization.d
import std.stdio;
import Template;
template Generic(A:int) {
void sayHello() {
writefln("only for ints");
}
}
void main() {
testTemplate!int();
}
Этот код печатает «общий», когда я его запускаю. Поэтому я спрашиваю, есть ли какой-нибудь хороший обходной путь, чтобы можно было использовать более специализированную форму из алгоритма.
Обходной путь, который я использовал в вопросе о классах типов, состоял в том, чтобы смешать общие функции после импорта всех файлов с шаблоном специализация, но это несколько некрасиво и ограниченно.
Я слышал, что в c ++ 1x будут шаблоны extern, которые позволят это. Есть ли у D аналогичная функция?