首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套模板(模板模板参数)

嵌套模板(模板模板参数)
EN

Stack Overflow用户
提问于 2016-08-22 11:23:51
回答 2查看 4.3K关注 0票数 3

如何编写接受嵌套模板的模板函数?

例如,我想编写以下函数:

代码语言:javascript
复制
void print(const T1<T2<T3>> &container);

曾试过:

代码语言:javascript
复制
template<
  template<typename> class T1,
  template<typename> class T2,
  class T3
>
void print(const T1<T2<T3>> &container) {
  for (auto &e : container)
    for (auto x : e)
      std::cout<<e<<' ';
  std::cout<<'\n';
}

int main()
{
  std::vector<std::deque<int>> c = {{1,2},{3}};
  print(c);
  return 0;
}

从g++编译错误:

代码语言:javascript
复制
a.cc: In function ‘int main()’:
a.cc:23:14: error: no matching function for call to ‘print(std::vector<std::deque<int> >&)’
       print(c);
              ^
a.cc:12:10: note: candidate: template<template<class> class T1, template<class> class T2, class T3> void print(const T1<T2<T3> >&)
     void print(const T1<T2<T3>> &container) {
          ^
a.cc:12:10: note:   template argument deduction/substitution failed:
a.cc:23:14: error: wrong number of template arguments (2, should be 1)
       print(c);
              ^
a.cc:8:32: note: provided for ‘template<class> class T1’
       template<typename> class T1,
                                ^

来自Clang的编译错误:

代码语言:javascript
复制
a.cc:23:7: error: no matching function for call to 'print'
      print(c);
      ^~~~~
a.cc:12:10: note: candidate template ignored: substitution failure : template template argument has different template parameters than its corresponding
      template template parameter
    void print(const T1<T2<T3>> &container) {
         ^

也曾尝试过:

代码语言:javascript
复制
template<
  template<template<typename> class> class T1,
  template<typename> class T2,
  class T3
>
void print(const T1<T2<T3>> &container);

但即使在推导之前,它仍然存在编译错误:

代码语言:javascript
复制
a.cc:12:25: error: template argument for template template parameter must be a class template or type alias template
    void print(const T1<T2<T3>> &container) {
                        ^

编辑--编辑--

如果我想返回指向其中一个类型的指针,该怎么办?

代码语言:javascript
复制
 T3 get(const T1<T2<T3>> &container);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-22 11:32:36

不过,我更希望您使用单个模板并从中选择类型。

类似于:

代码语言:javascript
复制
template<typename T1>
void print(const T1& container) { //As opposed to const T1<T2<T3>> &container
    using T2 = typename T1::value_type;
    using T3 = typename T2::value_type;

  for (auto &e : container)
    for (auto x : e)
      std::cout<<x<<' ';
  std::cout<<'\n';
}

但是,如果您必须按自己的方式进行,那么这将有效(http://en.cppreference.com/w/cpp/container/vectorhttp://en.cppreference.com/w/cpp/container/deque实际上是用两个模板参数声明的,尽管分配程序是默认的)。

代码语言:javascript
复制
template<
  template<typename, typename> class T1,
  template<typename, typename> class T2,
  typename AllocT1, typename AllocT2, 
  typename T3
>
void print(const T1<T2<T3, AllocT2>, AllocT1> &container) {
  for (auto &e : container)
    for (auto x : e)
      std::cout<<x<<' ';
  std::cout<<'\n';
}

但有一个更整洁的解决方案:

代码语言:javascript
复制
template<typename T1, 
         typename T2 = typename T1::value_type,
         typename T3 = typename T2::value_type>
T3 print(const T1& container){

  for (auto &e : container)
    for (auto x : e)
      std::cout<<x<<' ';
  std::cout<<'\n';

  return T3();
}

这个选择显然是你的。:-)

编辑:

如果我想返回指向其中一个类型的指针,该怎么办? T3 get(const T1 &container);

在C++14中,您可以简单地使用auto占位符返回类型,或者使用上面的后一种解决方案。

票数 7
EN

Stack Overflow用户

发布于 2016-08-22 11:32:07

一个模板参数将适用于您:

代码语言:javascript
复制
template<class T>
void print(const T& container) {
  for (auto &e : container)
    for (auto x : e) std::cout << x << ' ';
  std::cout << '\n';
}

Live Demo

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39078287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档