2010-06-17 14 views
7

cómo puedo insertar mis propios objetos de clase en ptr_map de boost. Los objetos están modelados por lo que no puedo usar un nombre de tipo estático en el mapa. Así que lo hice:Impulse cualquier uso

ptr_map<string, any> someMap; 

Mi clase hereda el impulso :: noncopyable.

someMap.insert("Test", new MyClass<SomeTemplate>()); 

El error es: error: no matching function for call to ‘boost::ptr_map.


UPD: preferiría hacer algo de envoltura y no uso el impulso :: ninguna. Entonces:

class IWrapper { }; 
class MyClass : public IWrapper { }; 

ptr_map<string, IWrapper> someMap; 
someMap.insert("Test", new MyClass<SomeTemplate>()); 

¿Por qué no funciona (el mismo error)? Podría pasar la clase heredada a la interfaz principal. ¿Qué pasa?

Respuesta

3

De lejos, la mayoría de las veces los problemas de este tipo deberían resolverse con una clase base común. Este es el caso cuando todas las clases se usarán de manera similar. Polimorfismo en tiempo de ejecución

He visto razones legítimas para no permitir una clase base común. En este caso, el boost::variant generalmente servirá mejor ya que todavía hay métodos para tratar cada artículo de manera uniforme (un visitante). Compilar el polimorfismo de tiempo.

Nunca he visto un uso legítimo para boost::any. No digo que no haya ninguno, pero es tan raro que nunca lo haya encontrado.


Dicho esto, pruebe esto.

std::map<std::string,boost::any> someMap; 
boost::any insanity = new MyClass<SomeTemplate>; 
someMap.insert("Test",insanity); 

o

boost::ptr_map<std::string,boost::any> someMap; 
boost::any* ive_lost_it = new boost::any(new MyClass<SomeTemplate>); 
someMap.insert("Test", ive_lost_it); 
+0

Mi clase tiene plantilla. He actualizado la muestra. No puedo hacer una base para eso (sin plantilla). – Ockonal

+0

Bien, gracias. La forma con cualquiera debería funcionar. ¿Pero podrías mirar la nueva actualización del código? Traté de darme cuenta de tu primera idea. – Ockonal

1

En primer lugar debe proporcionar ninguna * a su ptr_map.
Luego la clave debe ser un valor l (debido a problemas de seguridad de excepción).

boost::ptr_map<std::string, any> someMap; 
any * p = new any(MyClass<Sometype>); 
std::string test = "test"; 
someMap.insert(test, p); 

- editar
Lo mismo si está utilizando una clase contenedora. la clave debe ser un lvalue

Por cierto, el problema con la clase envoltura/base aquí es que no podrá volver al tipo original (y tampoco tiene polimorfismo dinámico debido al tipo de plantilla).

+0

¿Qué significa 'lvalue'? ¿Podrías mostrar algo de muestra? – Ockonal

+0

lvalue significa asignable (y no const). "test" no es asignable y const, std :: string test es un lvalue. – log0

Cuestiones relacionadas