Como posso escrever um modelo de função para todos os tipos com uma característica específica?
Considere o seguinte exemplo:
struct Scanner
{
template <typename T>
T get();
};
template <>
string Scanner::get()
{
return string("string");
}
template <>
int Scanner::get()
{
return 10;
}
int main()
{
Scanner scanner;
string s = scanner.get<string>();
int i = scanner.get<int>();
}
oScanner
A classe é usada para extrair tokens de alguma fonte. O código acima funciona bem, mas falha quando tentoget
outros tipos integrais como umchar
ou umunsigned int
. O código para ler esses tipos é exatamente o mesmo que o código para ler umint
. Eu poderia apenas duplicar o código para todos os outros tipos integrais que gostaria de ler, mas prefiro definir um modelo de função para todos os tipos integrais.
Eu tentei o seguinte:
struct Scanner
{
template <typename T>
typename enable_if<boost::is_integral<T>, T>::type get();
};
O que funciona como um encanto, mas não tenho certeza de comoScanner::get<string>()
para funcionar novamente. Então, como posso escrever código para poder fazerscanner.get<string>()
escanner.get<any integral type>()
e tem uma definição única para ler todos os tipos integrais?
Atualização: questão bônus: E se eu quiser aceitar mais de um intervalo de classes com base em algumas características? Por exemplo: como devo abordar esse problema se quiser ter trêsget
funções que aceitam (i) tipos integrais (ii) tipos de ponto flutuante (iii) strings, respectivamente.