2010-06-16 17 views
1

Je souhaite enregistrer des objets de signaux boost dans la carte (association: nom du signal → objet signal). La signature des signaux est différente, donc le deuxième type de carte doit être boost :: any.Enregistrement d'objets dans la matrice

map<string, any> mSignalAssociation; 

La question est de savoir comment stocker des objets sans définir le type de nouvelle signature de signal?

typedef boost::signals2::signal<void (int KeyCode)> sigKeyPressed; 
mSignalAssociation.insert(make_pair("KeyPressed", sigKeyPressed())); 
// This is what I need: passing object without type definition 
mSignalAssociation["KeyPressed"] = (typename boost::signals2::signal<void (int KeyCode)>()); 
// One more trying which won't work. And I don't want use this 
sigKeyPressed mKeyPressed; 
mSignalAssociation["KeyPressed"] = mKeyPressed; 

Tout cela tryings jeter l'erreur:

/usr/include/boost/noncopyable.hpp: In copy constructor ‘boost::signals2::signal_base::signal_base(const boost::signals2::signal_base&)’: 
In file included from /usr/include/boost/signals2/detail/signals_common.hpp:17:0, 
/usr/include/boost/noncopyable.hpp:27:7: error: ‘boost::noncopyable_::noncopyable::noncopyable(const boost::noncopyable_::noncopyable&)’ is private 
/usr/include/boost/signals2/signal_base.hpp:22:5: error: within this context 
---------- 
/usr/include/boost/signals2/detail/signal_template.hpp: In copy constructor ‘boost::signals2::signal1<void, int&, boost::signals2::optional_last_value<void>, int, std::less<int>, boost::function<void(int)>, boost::function<void(const boost::signals2::connection&, int)>, boost::signals2::mutex>::signal1(const boost::signals2::signal1<void, int, boost::signals2::optional_last_value<void>, int, std::less<int>, boost::function<void(int)>, boost::function<void(const boost::signals2::connection&, int)>, boost::signals2::mutex>&)’: 
In file included from /usr/include/boost/preprocessor/iteration/detail/iter/forward1.hpp:52:0, 
/usr/include/boost/signals2/detail/signal_template.hpp:578:5: note: synthesized method ‘boost::signals2::signal_base::signal_base(const boost::signals2::signal_base&)’ first required here 
       from /usr/include/boost/signals2.hpp:16, 
--------- 
/usr/include/boost/signals2/preprocessed_signal.hpp: In copy constructor ‘boost::signals2::signal<void(int)>::signal(const boost::signals2::signal<void(int)>&)’: 
In file included from /usr/include/boost/signals2/signal.hpp:36:0, 
/usr/include/boost/signals2/preprocessed_signal.hpp:42:5: note: synthesized method ‘boost::signals2::signal1<void, int, boost::signals2::optional_last_value<void>, int, std::less<int>, boost::function<void(int)>, boost::function<void(const boost::signals2::connection&, int)>, boost::signals2::mutex>::signal1(const boost::signals2::signal1<void, int, boost::signals2::optional_last_value<void>, int, std::less<int>, boost::function<void(int)>, boost::function<void(const boost::signals2::connection&, int)>, boost::signals2::mutex>&)’ first required here 
       from /home/ockonal/Workspace/Projects/Pseudoform-2/include/Core/Systems.hpp:6, 
+0

Je suis confus par ce que vous entendez par: "La question est de savoir comment stocker des objets sans définir le type de nouvelle signature de signal?" – GManNickG

+0

@gman, je ne veux pas définir un nouveau type de signature de signal. Et utilisez-le directement pendant l'insertion. – Ockonal

Répondre

4

Cela n'a rien à voir avec any ou map. Les signaux Boost sont simplement non-copiables. Vous pouvez les envelopper dans un pointeur intelligent tel que shared_ptr si vous voulez quelque chose qui est copiable et nettoie après lui-même.

+0

Comment faire un emballage sans définition de type? J'ai essayé: 'shared_ptr keyEvent;' Mais il dit à propos de mauvais premier paramètre dans le modèle. – Ockonal

+0

Vous n'avez pas besoin de 'nom de fichier 'ici. Il est seulement nécessaire pour les types qui dépendent des paramètres de type de modèle, mais le cas n'est pas celui-là, et 'typename' est interdit là. –