Articles of Modelos

Fazendo um static_assert que um tipo de modelo é outro modelo

Como faço para static_assert assim? Talvez Boost suporta, se não C ++ ou novos resources em C ++ 11? template struct foo {}; template struct bar { static_assert(FooType is indeed foo for some T,”failure”); //how? };

Escopo dependente e modelos nesteds

Quando eu compilar isso: #ifndef BTREE_H #define BTREE_H #include template class btree { public: class node { public : node(); private: node* parent; QList values; QList children; }; public: btree(); void insert(const T& value); node* findLeaf(const T& value); void performInsertion(const T& value, node& place); // node* root; }; #endif // BTREE_H A implementação do findLeaf […]

Por que essa ambigüidade é aqui?

Considere que eu tenho o seguinte código mínimo: #include template struct TData { typedef typename boost::remove_extent::type value_type; ptr_t data; value_type & operator [] ( size_t id ) { return data[id]; } operator ptr_t & () { return data; } }; int main( int argc, char ** argv ) { TData t; t[1][1] = 5; return […]

Como evitar a instanciação de modelos não especializados?

Eu tenho uma class modelo (chamada Foo ), que tem várias especializações. Eu gostaria que a compilation falhasse se alguém tentasse usar uma versão não especializada do Foo . Aqui está o que eu realmente tenho: template class Foo { Foo() { cannot_instantiate_an_unspecialized_Foo(); } // This method is NEVER defined to prevent linking. // Its […]

Registro do tipo C ++ no truque de tempo de compilation

Eu tenho a seguinte situação: suponha que eu tenha um monte de tipos (functors) que eu quero registrar / compilar durante a compilation, de preferência em algo como boost :: mpl :: vector. Você conhece algum truque para fazer isso tão bem? Meu desejo é ter o arquivo hpp que implemente o tipo de functor […]

Registrar dinamicamente methods de construtor em um AbstractFactory em tempo de compilation usando modelos C ++

Ao implementar uma class MessageFactory para instatia objects Message eu usei algo como: class MessageFactory { public: static Message *create(int type) { switch(type) { case PING_MSG: return new PingMessage(); case PONG_MSG: return new PongMessage(); …. } } Isso funciona bem, mas toda vez que eu adiciono uma nova mensagem eu tenho que adicionar um novo […]

Combinando Recursos Asséticos em Modelos Herdados

Estamos construindo um novo site usando o Symfony2, e o Assetic parece muito promissor para o gerenciamento de resources, em particular para combinar e processar todos os arquivos js / css juntos automaticamente. Nós teremos alguns resources que são usados ​​em todo o site, e alguns que são específicos para determinadas páginas. Também estaremos usando […]

Tornando um parâmetro de modelo um amigo?

Exemplo: template class Base { public: Base(); friend class T; }; Agora isso não funciona … Existe uma maneira de fazer isso? Eu estou realmente tentando fazer um selador de class geral como este: class ClassSealer { private: friend class Sealed; ClassSealer() {} }; class Sealed : private virtual ClassSealer { // … }; class […]

Por que a palavra-chave “typename” é necessária antes de nomes dependentes qualificados e não antes de nomes independentes qualificados?

class A { static int iterator; class iterator { […] }; […] }; Eu (acho que) entendo a razão pela qual o typename é necessário aqui: template void foo() { typename T::iterator* iter; […] } mas eu não entendo a razão pela qual o typename não é necessário aqui: void foo() { A::iterator* iter; […] […]

acessando membros protegidos da superclass em C ++ com modelos

Por que um compilador C ++ não reconhece que g() b são membros herdados da Superclass conforme visto neste código: template struct Superclass { protected: int b; void g() {} }; template struct Subclass : public Superclass { void f() { g(); // compiler error: uncategorized b = 3; // compiler error: unrecognized } }; […]