В общем случае Dynamic должен принимать любой метод поиска во время компиляции, как вы сказали.Предположим на мгновение, что вы можете запретить предикату isInputRange вычислять значение true, теперь неправильный код будет сгенерирован при попытке создать Dynamic из входного диапазона.
Я не думаю, что это поправимо, по крайней мере, не в общем смысле.В этом конкретном случае лучшее решение, которое я могу придумать, состоит в том, что Dynamic предоставляет свою собственную версию toString, и writeln предпочел бы ее над специализацией inputRange.Я считаю, что writeln не делает этого в данный момент, по крайней мере, не для структур, но, вероятно, должно.
Другим компромиссом было бы запретить несколько методов, таких как popFront, в ограничении opDispatch, вместо этого Dynamic предоставил бы opIndex или объект-член для доступа к этим особым случаям.Это может быть не так плохо, как кажется, потому что особые случаи редки, и их использование приведет к очевидной ошибке компиляции.
Я думаю, что лучший способ спасти такое разрешение методов для Dynamic - этоисправьте writeln и примите, что Dynamic не будет работать со всем шаблонным кодом.