Pergunta

Suponha que eu tenho um conjunto de funções e classes que são modeladas para uso único (float) ou precisão double. Claro que eu poderia escrever apenas dois pedaços de código de inicialização, ou mexer com macros. Mas eu só posso mudar argumento modelo em tempo de execução?

Foi útil?

Solução

Não, você não pode alternar argumentos de modelo em tempo de execução, uma vez que os modelos são instanciado pelo compilador em tempo de compilação. O que você pode fazer é ter ambos os modelos de derivar de uma classe base comum, sempre use a classe base no seu código, e então decidir qual derivado classe para uso em tempo de execução:

class Base
{
   ...
};

template <typename T>
class Foo : public Base
{
    ...
};

Base *newBase()
{
    if(some condition)
        return new Foo<float>();
    else
        return new Foo<double>();
}

Macros têm o mesmo problema como modelos, na medida em que são expandidas em tempo de compilação.

Outras dicas

Os modelos são um mecanismo de tempo de compilação. BTW, macros são bem (estritamente falando - um mecanismo de pré-processamento - que vem antes mesmo de compilação).

Os modelos são puramente uma construção tempo de compilação, o compilador irá expandir um modelo e criar a sua classe / função com o argumento especificado e traduzir diretamente que o código.

Se você está tentando alternar entre foo<float> e foo<double> em tempo de execução, você quer necessidade de usar alguns truques metaprogramming ou apenas ter caminhos de código separado para cada um.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top