Eu tenho uma classe modelo que tem uma função ( myfunc()
) que faz o mesmo em todos os casos, T
exceto em alguns casos (por exemplo, bool
). Eu tenho uma solução funcional, com base nesta pergunta :
template <class T> class opt_arg{
private: void myfunc(){
/*Do generic stuff */
}
/* Can I insert here the bool specialization? */
};
/* The specialization "inserted outside of the class body": */
template<>
inline void opt_arg<bool>::myfunc(){
/* Do bool specific stuff*/
}
Como mencionei, está funcionando bem. Só estou pensando, posso inserir a especialização de função dentro do "corpo da classe"?
A partir do C++17 você pode usar
if constexpr
(que é resolvido em tempo de compilação) para obter um resultado semelhante:Live demo
Como @JeremyRichards comentou abaixo ,
if constexpr
neste caso o código no branch false pode nem compilar (graças à resolução do tempo de compilação), o que pode ser útil.Mais informações sobre isso podem ser encontradas aqui: Por que o branch false de "if constexpr" é compilado? (resumo: isso é verdade apenas para
if constexpr
dentro de um modelo, e o código não deve ser malformado de qualquer maneira).Observe o uso do
std::same_as
conceito que está disponível no C++20. Para o C++17, você pode usar o traço typestd::is_same
(e o auxiliarstd::is_same_v
).Você pode adicionar mais
if constexpr
ramificações para outros tipos, se necessário (ou tratar vários tipos na mesma ramificação).Dessa forma, a lógica para ambos os casos estará em um só lugar, de forma semelhante ao que você queria.