【问题标题】:use template to print all the data of any container使用模板打印任何容器的所有数据
【发布时间】:2014-05-18 06:44:13
【问题描述】:

我打算写一个可以打印任何容器的所有数据的函数。换句话说,我可以使用不同的容器类型,例如向量、双端队列或列表,并且可以使用不同的数据类型(整数、双精度或字符串)来调用它。 模板函数可以通过编译器,但是不知道怎么调用。

#include <cstdlib>
#include <stdio.h>
#include <iostream>
#include <list>

using namespace std;

template <typename C, template <typename C> class M>
void print(M<C> data){
typename M<C>::iterator it;
for(it=data.template begin();it!=data.template end();++it){
    cout<<*it<<" ";
}
cout<<endl;
}


int main(int argc, char** argv) {
list<int> data;
for(int i=0;i<4;i++){
    data.push_back(i);
}
print<int>(data);   //compile error
print<int, list>(data);   //compile error
 return 0;
}

错误信息: main.cpp:35:20: 错误: 没有匹配函数调用'print(std::list&)' main.cpp:35:20: 注意:候选人是: main.cpp:21:6: 注意:模板类 M> void print(M)

一些相关的线程: template function for multiple containers and data types http://louisdx.github.io/cxx-prettyprint/

【问题讨论】:

  • std::list 有多个模板参数。你也不应该明确地给出模板参数。

标签: c++ templates containers


【解决方案1】:

如 cmets 中所述,std::list 实际上有多个模板参数(第二个参数是分配器)。而且print不需要带两个模板参数;您可以简单地将其参数化为整个容器类型:

#include <iostream>
#include <iterator>
#include <list>
using namespace std;

template <typename C>
void print(const C &data){
    for(auto it=begin(data);it!=end(data);++it){
        cout<<*it<<" ";
    }
    cout<<endl;
}


int main(int argc, char** argv) {
    list<int> data;
    for(int i=0;i<4;i++){
        data.push_back(i);
    }
    print(data);
    return 0;
}

Demo.

正如另一个答案中所指出的,如果您可以使用 C++11 功能,则 range-for 循环比上面使用的显式迭代器要好。如果你不能(这意味着没有autostd::beginstd::end),那么:

template <typename C>
void print(const C &data){
    for(typename C::const_iterator it=data.begin();it!= data.end();++it){
        cout<<*it<<" ";
    }
    cout<<endl;
}

请注意,由于我们通过 const 引用获取 data,因此我们需要使用 const_iterator

【讨论】:

    【解决方案2】:

    使用 c++11 可以将其简化为:

    template <typename C>
    void print(const C &data){
        for (auto &elem : data)
            cout << elem << " ";
        cout << endl;
    }
    

    并使用print(data) 调用它。您也可以使用std::for_eachcopy it directly into cout

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-07
      • 1970-01-01
      • 2021-10-09
      • 2019-09-20
      • 2011-12-25
      • 1970-01-01
      • 2015-12-08
      相关资源
      最近更新 更多