É possível ter uma classe com um parâmetro de template opcional que possa ser chamado assim?:
#include <iostream>
template <typename T = void>
class A final
{
public:
// This class can be called only when T exists.
void f()
{
printf("%d\n", member);
}
// This method can be called only when T is missing.
void g()
{
printf("No template parameter\n");
}
public:
T member;
};
int main()
{
A<int> a1;
A a2;
a1.f(); // should be valid
a1.g(); // should be invalid, cannot compile
a2.f(); // should be invalid, cannot compile
a2.g(); // should be valid
return 0;
}
Se sim, quais são as funções padrão que devem ser usadas?
Você pode usar o método "antigo" com especialização:
Ao transformar sua classe em variável, para tratar o parâmetro ausente como um pacote vazio, em vez de void, você pode fazer:
Restrições da API da função membro
Você pode aproveitar restrições e conceitos, especialmente o
std::same_as
conceito:E o membro?
Se você quiser que o membro exista apenas para determinadas especializações, você poderá envolvê-lo em um modelo de classe especializado de acordo. Por exemplo:
Outra abordagem seria usar uma classe base auxiliar para herdar o(s) membro(s), o que pode ser útil principalmente se os construtores de A dependerem de características do próprio tipo. Por exemplo,
std::optional
normalmente é implementado usando mixins de várias classes base.Você também pode querer colocar restrições no
A
próprio parâmetro do modelo da classe em relação aos tipos de tipos que fazem sentido agrupar na classe.Usando a abordagem mínima: