Existem vários motivos para isso, os princípais estão listados abaixo:
Isso impede o uso de recursão de template como estrutura de loop, pois não é possível
estabelecer uma condição de saída da recursão.
Isso restringe a configurabilidade de uma classe genérica ('template'). Não é possível especificar
por parâmetro algo como "utilizar_busca_ordenada", ou "número_máximo_de_elementos_na_lista".
A vantagem dessa característica é que a simples leitura de uma classe genérica permite a availação de quais chamadas de
métodos, acesso a atributos, etc.. são válidas para cada objeto/classe.
Em C++, por exemplo, parâmetros de templates não são tipados. Com isso, um classe template não pode ser validada
através do seu código, pois dependendo do parâmetro forncecido a instanciação do template pode ou não ser válida.
A abordagem de C++, apesar de dificultar o entendimento do código e complicar a validação de código implementado, permite
uma flexibilidade muito maior. A vantagem é que um template depende apenas da interface do tipo passado como parâmetro.
Além disso ele mantém ela flexível, exigindo apenas os métodos/atributos/typedefs que foram efetivamente utilizados.
Em C++ o seguinte template é valido:
template
struct Y : public X
{
//code
};
SMP implica em gerar código otimizado para cada uma das instanciações dado os parâmetros de
entrada (além dos externos, porém estes são constantes entre instanciações e suportados pelo Eiffel).
Isso provavelmente não é verdade para classes que possuem a propriedade EXPANDED, que diz que não deve ser usado um ponteiro
para um objeto dessa classe, mas sempre copiá-la (tal qual um int na declaração: int x; classes não espandidas equivaleriam a int *x;).
Isso deve, no entando, ser confirmado.
A explicação para o uso do mesmo código é a tentativa de Eiffel de reduzir ao máximo as penalidades do suporte
a genericidade, principalmente em tamanho de código, gerada por outras alternativas onde cada instancia irá gerar código
extra, o que na maioria dos casos não é desejável.