2015-06-24 37 views
-2
template<typename T> 
ostream& operator <<(ostream& os,const T &r_list) 
{ 
//Function body 
} 

在上述碼T可能是所有,但每次一個(矢量,地圖,矢量<矢量>,地圖<原始類型,矢量>,地圖<原始類型,地圖>)。如何識別模板中的類型名稱類型?

我想將上面的stl內容值寫入文件中。我認爲,我可以通過查找T類型(矢量,地圖)來完成它。所以像這樣寫了typeid(r_list).name,但是我找不到類型。請告訴我如何做到這一點。

+0

當你說「單功能」,你的意思是使用重載和'模板模板'params能夠處理說'int'和'列表'?即有多個功能? – doctorlove

回答

1

我知道你想實現一個通用的流輸出獨立的容器類型。這樣做 - 特別是以一種很好的方式做到這一點 - 並不那麼容易,並且需要涵蓋幾個方面,例如參見SO:Pretty-print C++ STL containers中的線程。

然而,已經用一個簡單的第一種方法,你可以獲取至少基本輸出能力:

//for std::map 
template<typename ... Args> 
std::ostream& operator<<(std::ostream& os, std::pair<Args ...> const& t) 
{ 
    return os<<t.first<<" "<<t.second; 
} 

template<template <typename ...> class Container, typename ... Args> 
std::ostream& operator<<(std::ostream& os, Container<Args ...> const& t) 
{ 
    for(auto const& i : t) 
    { 
     os<<i<<" "; 
    } 
    os<<"\n"; 
    return os; 
} 

這裏,流運營商遞歸調用自己,直到它到達了它的過載存在一個類型。 (爲此,您通常必須提供自定義類的流輸出)。

請注意,容器需要在這裏進行範圍迭代(人們可以進一步抽象,但爲了得到這個想法,我認爲這是足夠的)。

這樣,至少以下打印的東西:

int main() 
{ 
    std::set<std::vector<std::list<double> > > a{ {{1.0, 2.0}, {3.0}}, {{4.0}} }; 
    std::cout<<a<<std::endl; 


    std::map<int, std::vector<int> > b{{1,{2,3}}}; 
    std::cout<<b<<std::endl; 
} 

DEMO ...或者, 「哎,我並沒有說這是不錯的。」

但問題是,格式是否適合您的需求......我建議至少調整它 - 或者更好地使用上面提到的庫。