Especialização de modelo em C ++

Alguns modelos não andam juntos tão facilmente como você poderia esperar porque expressam um conceito que não se traduz da mesma forma para cada tipo de dados. Por exemplo, quando você usa stringify para transformar um tipo de dados em sua representação de seqüência, a técnica varia conforme o tipo de dados. Por exemplo, quando você quer usar stringify em um int, que você pode utilizar o seguinte modelo:

#incluir #incluir usando namespace std-template cadeia em linha stringify (const T input) {saída de saída ostringstream lt; lt; output.str input-return () -} int main () {// Essa chamada funciona como expected.cout lt; lt; stringify(42) lt; lt; endl - // Este truncates.cout chamada lt; lt; stringify(45,6789012345) lt; lt; endl-retorno 0-}

o stringify () função aceita qualquer tipo de dados e simplesmente usa um ostringstream converter entrada para uma corda. Esta abordagem funciona bem para a primeira chamada em a Principal(), que é um int. No entanto, quando o código usa-o para uma duplo, o resultado é truncado como mostrado aqui:

4245.6789

Você pode corrigir esse problema adicionando um tratamento especial para um duplo. Aqui é a forma modificada do exemplo (como mostrado na StringifyDouble) Que acomoda um duplo.

#incluir #incluir #incluir #incluir usando namespace std-template cadeia em linha stringify (const T input) {saída de saída ostringstream lt; lt; output.str input-return () -} template lt;> string em linha stringify (Double const input) {ostringstream saída de const int sigdigits = numeric_limits:: Digits10-output lt; lt; setprecision (sigdigits) lt; lt; output.str input-return () -} int main () {cout lt; lt; stringify(42) lt; lt; endl-cout lt; lt; stringify(45,6789012345) lt; lt; endl-retorno 0-}

Quando você executar este exemplo, você vê o resultado esperado porque o duplo forma dos usos do modelo setprecision para modificar o ostringstream valor. Como resultado, você vê o seguinte resultado:

4.245,6789012345

Como as coisas se sentar com C ++, hoje, você deve criar um modelo especial para cada tipo de dados que exige. Teoricamente, se C ++ sempre recebe um typeof () função, você pode detectar o tipo de dados e adicionar um interruptor para executar o processamento especializado dentro de um único modelo.

o typeid () função poderia funcionar como um substituto para typeof (), mas é específico do fornecedor e não implementado em cada versão do C ++. Se você optar por usar o typeid () função, certifique-se de saber qual compilador sua organização usará para compilar o código do aplicativo.

Você também pode ter notado o na linha palavra-chave utilizada para o modelo neste exemplo. o na linha palavra-chave informa o compilador para colocar o código criado pelo modelo de acordo com o código em que aparece, em vez de fora da linha como uma chamada de função separada. Em alguns casos, tais como este stringify () função, o resultado é o código que é executado mais rapidamente.

O compilador não tem a obrigação de cumprir a na linha palavra-chave. Além disso, você quer código do modelo colocado fora da linha quando ele deve executar algum nível de instanciação ou não representa código de caminho crítico que o aplicativo pode chamar muitas vezes.

menu