2012-05-28 37 views
0

我有一個type_info對象,它定義了我的屬性映射中的屬性類型。我想用我的type_info對象定義的類型運行一些代碼(例如從cin讀取值)。這可能是一些模板功能,即:基於type_info對象的專業代碼

template<typename T> 
void do_something() 
{ 
    T a; cin >> a; 
} 

然後在代碼的其它部分,我想叫它:

const type_info &type_description = foo.get_type_of_something(); 
do_some_magic(do_something, type_description); 

我在尋找的do_some_magic函數調用do_something專門用於類型由type_descriptor描述。模板函數可以封裝在某個結構中,沒關係。

當然,只有預先定義的有限類型的集合纔可能(因爲在編譯時必須爲每個類型生成專門化)。

一種方法是使鏈條if(type_descriptor==typeid(int)) /*...*/ else if(type_descriptor==...等,但這不是很漂亮的解決方案(IMO)。

我想知道是否存在更清潔的解決方案?或者,也許一些庫(最好是「boost」)已經實現了這種機制?

+1

我懷疑如果我們知道你真的想做什麼,我們會建議你去_type擦除_...也許甚至是一個'boost :: variant <>'... –

回答

1

A type_info對象向您提供有關對象的信息,在運行時。解決您的問題的唯一方法是將其與每個目標類型的typeid運算符的結果進行比較。

既然你正在尋找的東西漂亮,你可以做type_infomap(包裹,實際上)到(boost|std)::function<>秒。

0

當你知道在編譯時的類型簡單的情況下,是使用函數重載:

RETURN_TYPE_1 do_something_magic(TYPE_1) { ... }

RETURN_TYPE_2 do_something_magic(TYPE_2) { ... }

...

do_something_magic(foo); //只是按預期工作

只要你知道它們在編譯時的類型,就可以將這個技巧擴展到多個參數。

如果您想基於ONE參數類型分派dynamicaly,爲了讓類型信息必須使用動態多態性,那麼只需使用RTTI和C++的本地能力根據第一個類型簽名進行分派,以上如果你有一個虛擬析構函數(非簡單的析構函數),並且每個重載函數的返回類型都是相同的,那麼代碼仍然是很好的代碼。

如果您想根據多種參數類型分派dynamicaly,關注點是完全不同的,您必須使用Mutimethod的技術知識,它在維基百科上得到了很好的解釋,boost提供了一個實現。