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

de 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, você pode usar o seguinte modelo:

Video: C++ - Aula 30 - Fila / Queue

#incluir #incluir using namespace std-modelo corda em linha stringify (const T& entrada) {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 a um corda. Esta abordagem funciona bem para a primeira chamada em a Principal(), que é um int. No entanto, quando o código usa-lo para um 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.

Video: 3D Model Loading Basic Loader Tutorial, .obj mesh & textures C++ openGL

#incluir #incluir #incluir #incluir using namespace std-modelo corda em linha stringify (const T& entrada) {saída de saída ostringstream lt; lt; output.str input-return () -} template lt; gt; stringify corda em linha (Duplo const& entrada) {ostringstream saída 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 esse exemplo, você vê o resultado esperado porque o Duplo forma de molde os usos 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 uma tipo de() 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 tipo de(), mas é específico do fornecedor e não implementado em todas as versões 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 usada para o modelo de 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, como este stringify () função, o resultado é código que executa mais rápido.

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.


Publicações relacionadas