Selecione modelo de argumento em tempo de execução em C ++
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?
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.