2015-06-24 234 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 ...或者, “哎,我并没有说这是不错的。”

但问题是,格式是否适合您的需求......我建议至少调整它 - 或者更好地使用上面提到的库。