如何识别模板中的typename类型?

时间:2015-06-24 12:50:22

标签: c++

template<typename T>
ostream& operator <<(ostream& os,const T &r_list)
{
 //Function body
}

在上面的代码中,T可以是全部,但是一次一个(矢量,地图,矢量&lt;矢量&gt;,地图&lt;基元类型,矢量&gt;,地图&lt;基元类型,地图&gt;)。

我想将上述stl内容值写入文件。我想,我可以通过找到T类型(矢量,地图)来做到。所以写得像这个typeid(r_list).name,但我找不到类型。请告诉我该怎么做。

1 个答案:

答案 0 :(得分: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 ...或者,&#34;嘿,我没有说它很好&#34;。

但是,格式是否符合您的需求是值得怀疑的......我建议至少相应地调整它 - 或者更好地使用上面提到的库。