2013-03-24 45 views
1

一個std ::功能我一直在使用的std ::功能,使我的課更通用的,而不是把虛擬會員這就需要聲明一個類全新的,我只在一個地方使用,但是我,當它需要序列化課程時,他們很難過。我知道序列化隨機C++代碼的想法不起作用,但那不是我需要做的。我知道這些函數已經存在於同一個二進制文件的其他地方,所以我覺得應該有辦法做到這一點。我並不反對以某種'hacky'的方式做到這一點,儘管最好它可以與gcc和MSVC一起工作序列化從同一個代碼庫

+5

你究竟在做什麼?聽起來像[X-Y問題](http://meta.stackexchange.com/q/66377/210732)給我。 – 2013-03-24 23:52:15

+0

我有一個遞歸序列化系統來將我的遊戲關卡保存到磁盤,但是我在遊戲對象中創建了一個通用對象,它可以執行一些不同的事情,具體取決於您爲其兩個std ::函數傳遞的內容, d寧願以某種方式序列化std ::函數,並且有一些方法可以從磁盤加載它們(在同一個exe文件中,但是不同的調用) – zacaj 2013-03-24 23:54:41

回答

3

如果您將id或「句柄」映射到可序列化的函數集,並執行此操作以確定性的,編譯時的方式,您可以將句柄序列化爲整數類型。在反序列化/加載時,您可以使用此確定性映射將句柄轉換爲相關的函數指針類型,並從中構建std :: functions。

這不是從序列化/在類反序列化指針如此不同。這種反序列化通常由兩個步驟組成:初始化POD類型,然後在第二遍中修復指針。

0

我們可以序列化一個std ::函數與它的參數,然後將它們歸檔到一個文件中,或者到網絡上,這樣我們就可以調用函數(使用指定參數)之後,我們重新啓動機器,或者更常見的是,在另一臺機器上調用rpc。

這裏是一個例子:

測試代碼: https://github.com/galaxyeye/atlas/blob/master/libs/serialization/test/function.cpp 實施: https://github.com/galaxyeye/atlas/blob/master/atlas/serialization/function.h

用於容易在C++中,這使得程序員使用遠程功能就像一個使用RPC框架本地函數,請參閱我的github上的項目先驅。

我將在下週一前完成它。

例如,如果你想在集羣中的所有機器殺的過程中,你的經理計劃,只是寫:

multicast_client客戶端; client.call(「pkill」,pkill,「a_bad_process」);我們假設服務器端程序執行如下的函數: void pkill(const std :: string & process_name);

希望有幫助:)