Pergunta

É possível escrever um modelo impuro no C ++? Ou seja, um modelo que às vezes fornece um tipo resultante ou int diferente para os mesmos parâmetros de modelo. Por exemplo, é possível escrever um modelo Foo<T> Onde Foo<int>::type As vezes char E outros momentos float? Ou um modelo Foo<T> Onde Foo<double>::my_static_const_int Às vezes é 10 e outras vezes 20?

Foi útil?

Solução

Não é possível. Se você tem um modelo que se comporta dessa maneira, ele viola o ODR e / ou outras regras, como uma especialização deve ser declarada antes que seja instanciada. Portanto, você não pode simplesmente colocar uma especialização que, de alguma forma, mudaria um membro do typedef para resolver um tipo diferente para todas as referências a seguir.

Lembre-se disso Foo<T> Referências uma classe se Foo é um modelo de classe. Se o membro typedef da classe for definido como um tipo em um ponto do programa e outro tipo em outro ponto, algo deve ter dado errado. Aqui estão várias citações padrão que dizem respeito a isso


Uma especialização para um modelo de função, um modelo de função do membro ou de uma função de membro ou membro estático de dados de um modelo de classe pode ter vários pontos de instanciações dentro de uma unidade de tradução. Uma especialização para um modelo de classe possui no máximo um ponto de instanciação em uma unidade de tradução. Uma especialização para qualquer modelo pode ter pontos de instanciação em várias unidades de tradução. Se dois pontos diferentes de instanciação fornecerem uma especialização de modelos diferentes significados de acordo com a regra de uma definição (3.2), o programa é mal formado, não é necessário diagnóstico.


Se um modelo, um modelo de membro ou o membro de um modelo de classe for explicitamente especializado, essa especialização será declarada antes do primeiro uso dessa especialização que causaria uma instanciação implícita, em todas as unidades de tradução em que esse uso ocorre ; Nenhum diagnóstico é necessário.


(Vários "ruído" ignorados)

.. várias entidades que podem ser definidas múltiplas em todo o programa ..]. Dada uma entidade chamada d definida em mais de uma unidade de tradução, então

  • Cada definição de D deve consistir na mesma sequência de tokens;
  • Em cada definição de D, os nomes correspondentes, procurados de acordo com 3.4, devem se referir a uma entidade definida na definição de D, ou se referirá à mesma entidade, após a resolução da sobrecarga (13.3) e após a correspondência da especialização do modelo parcial (14.8 .3) ...
  • Se D é um modelo e for definido em mais de uma unidade de tradução, os quatro últimos requisitos da lista acima serão aplicados aos nomes do escopo anexante do modelo usado na definição do modelo (14.6.3) e também a nomes dependentes no ponto de instanciação (14.6.2). Se as definições de d atenderem a todos esses requisitos, o programa se comportará como se houvesse uma única definição de D. Se as definições de D não atendem a esses requisitos, o comportamento será indefinido.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top