2010-06-16 174 views
1

我想在地圖中保存提升信號對象(關聯:信號名稱→信號對象)。信號簽名是不同的,所以第二種類型的地圖應該是boost :: any將對象存儲在數組中

map<string, any> mSignalAssociation; 

問題是如何在不定義新信號簽名類型的情況下存儲對象?

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; 

這一切tryings拋出錯誤:

/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

我很困惑你的意思是:「問題是如何存儲對象而不需要定義新的信號簽名類型?」 – GManNickG 2010-06-16 20:52:26

+0

@gman,我不想定義新類型的信號簽名。在插入時直接使用它。 – Ockonal 2010-06-16 20:53:26

回答

4

這有什麼好做anymap。提升信號簡直是不可複製的。如果你想要一些可複製和自行清理的東西,你可以將它們包裝在一個智能指針中,如shared_ptr

+0

如何在沒有類型定義的情況下進行包裝?我嘗試過: 'shared_ptr keyEvent;' 但它說模板中錯誤的第一個參數。 – Ockonal 2010-06-17 07:33:30

+0

你不需要'typename'。它只需要依賴於模板類型參數的類型,但你的情況不是這樣,並且'typename'在這裏是禁止的。 – 2010-06-17 18:57:21