Qual é a diferença entre uma classe de modelo e um modelo de classe?
Este é um ponto comum de confusão para muitos (incluindo a página de Programação Genérica na Wikipedia, alguns tutoriais C ++ e outras respostas nesta página). No que diz respeito ao C ++, não existe uma "classe de modelo", existe apenas um "modelo de classe". A maneira de ler essa frase é "um modelo para uma classe", em oposição a um "modelo de função", que é "um modelo para uma função". Novamente: classes não definem modelos, modelos definem classes (e funções). Por exemplo, este é um modelo , especificamente um modelo de classe , mas é não uma classe :
template<typename T> class MyClassTemplate
{
...
};
A declaração MyClassTemplate<int>
é uma classe, ou pedantemente, uma classe baseada em um modelo. Não há propriedades especiais de uma classe baseada em um modelo em comparação com uma classe não baseada em um modelo. As propriedades especiais são do próprio modelo .
A frase "classe de modelo" não significa nada, porque a palavra "modelo" não tem significado como adjetivo quando aplicada ao substantivo "classe" no que diz respeito a C ++. Implica a existência de uma classe que é (ou define) um modelo , o que não é um conceito existente em C ++.
Eu entendo a confusão comum, pois provavelmente se baseia no fato de que as palavras aparecem na ordem "classe de modelo" no idioma real, o que é uma história totalmente diferente.
Bjarne Stroustrup, o criador do C ++, diz em seu livro The C ++ Programming Language 4ª edição , 23.2.1 Definindo um modelo:
fonte
A diferença é que o termo "classe de modelo" simplesmente não existe no padrão C ++. É um termo usado principalmente por pessoas que acham que o termo "modelo de classe" é confuso (como as empresas de Qt Nokia e anteriormente Trolltech).
O Standard não tem conceito disso, então cabe a outras pessoas fazer a diferença. Algumas pessoas o usam como sinônimos, e outros dizem que o termo "classe de modelo" se refere a um modelo de classe instanciado ou explicitamente especializado, o que o tornaria equivalente ao termo "especialização de modelo de classe". Historicamente, tinha esse significado. O Manual de Referência Anotado define na página 343
O template-class-name não terminal é equivalente ao template-id não terminal usado no padrão de hoje e diminui
template-name < arguments >
.Para se familiarizar com os termos atuais, o que é mais importante do que usar termos antigos duvidosos
// (1) defines a class template template<typename T> class A { }; // (2) defines a class template explicit specialization template<> class A<int> { }; // (3) defines a class template partial specialization template<typename T> class A<T*> { }; // (4) explicitly instantiates A<char>. template class A<char>; // (5) implicitly instantiates A<short> (because of the member declaration) struct D { A<short> a; };
fonte
Uma classe de modelo está relacionada ao padrão de design do Método de modelo , enquanto o modelo de classe é apenas um modelo de classe de "preencher as lacunas".
fonte
Um modelo de classe é um modelo usado para gerar classes, enquanto uma classe de modelo é uma classe produzida por um modelo.
fonte
Classe de modelo: uma classe que possui definição genérica ou uma classe com parâmetros que não é instanciada até que a informação seja fornecida pelo cliente. É referido como um jargão para templates simples. Simplesmente classe com template de prefixo e uso de T. Modelo de classe: A construção individual de uma classe é especificada por um modelo de classe que é quase semelhante à maneira como os objetos individuais são construídos usando uma classe. É referido a um objeto da classe de modelo Ex- classname objectname (lista de argumentos)
fonte
O modelo de classe é uma classe genérica para diferentes tipos de objetos. Basicamente, ele fornece uma especificação para gerar classes com base em parâmetros. Sempre que um novo objeto é criado, uma nova classe ocorrerá na memória para esse propósito. Isso é chamado de instanciar um modelo de classe e cada versão instanciada da classe é chamada de classe de modelo.
fonte
Dê uma olhada neste artigo (da wg21 e foi publicado em 1992) :
template<class T> int nullcheck( T* pT ) { return ( pT != 0 ); }
template<class T> class S { int i; public: int sep_member(); int imm_member() { return 2; } }
class Normal { public: template<class T> int foo(T*pT) { return ( pT == 0 ); } };
template<class T> int S<T>::sep_member() { return i; }
fonte
Normal
classe que você descreveu acima: Eu não sabia que esse modelo de função de membro era proibido. É aceito por todos os compiladores que experimentei. o que estou perdendo?