C++ - 将标准容器作为模板模板参数传递

c++ - passing standard container as a template template parameter

提问人:Anton Tretyakov 提问时间:9/16/2022 更新时间:9/16/2022 访问量:120

问:

因此,我需要创建一个 mixin 类来封装某个派生类的子类。派生类应继承自 mixin,同时提供容器模板作为 mixin 的模板模板参数。

所需的代码有点像这样:

/*template definition*/
template<template<typename T, typename A> class C>
class HasChildren {
  protected:
    C<T, A> m_children;
    /* whatever */
};
 

它有一系列问题:

  1. 当尝试实例化这个类时,就像(仅用于测试)时,编译器说。显然,我没有传递模板模板。我想知道我到底想传递什么HasChildren<std::vector<int>>expected a class template, got ‘std::vector<int>’
  2. 因为编译器说,并且超出了范围。当我为它们添加关键字时,错误更改为 .我想知道为什么 TA 超出了范围,以及为什么添加 typename 会导致此错误C<T, A> m_children;TAtypenameerror: wrong number of template arguments (1, should be 2)
C++ STL 模板

评论

2赞 NathanOliver 9/16/2022
模板模板参数采用模板,例如 .模板参数采用一种类型,例如 .std::vectorstd::vector<int>
1赞 HolyBlackCat 9/16/2022
鉴于您不知道要传递给什么,您可能只需要一个模板-模板参数。例如,template-template 参数可以让你将 (w/o element type) 传递到 ,然后在声明时指定元素类型。此外,容器的模板-模板参数应具有参数而不是两个参数,以免需要手动指定分配器。C<...>typename Cstd::vectorHasChildrenm_children<typename...>typename

答:

2赞 Ted Lyngmo 9/16/2022 #1
  1. 传递一个类型 ,而不是一个模板 。std::vector<int>std::vector
  2. 您还需要接受模板模板参数。 不使模板模板使用 和 。它们仅用于文档,可以删除。template<typename T, typename A>TA

例:

template <template <class, class> class C, class T, class A>
//                                         ^^^^^^^  ^^^^^^^
class HasChildren {
   protected:
    C<T, A> m_children;
};

int main() {
    HasChildren<std::vector, int, std::allocator<int>> hc;
//              ^template^   ^-----parameters-------^
}

如果您更喜欢像最初尝试的那样进行实例化,请使用 ,您可以通过专门化:HasChildrenHasChildren<std::vector<int>>HasChildren

template<class> class HasChildren; // primary

// specialization:
template<template <class, class> class C, class T, class A>
class HasChildren<C<T,A>> {
   protected:
    C<T,A> m_children;
};

int main() {
    HasChildren<std::vector<int>> hc; 
}

评论

0赞 Anton Tretyakov 9/16/2022
啊,我明白了,谢谢你!但是,为了明确起见,为什么确切地和超出了范围?我认为模板范围以其定义的右括号结尾,其中有一个定义。TAHasChildren
1赞 Ted Lyngmo 9/16/2022
@AntonTretyakov 不客气。 在您的示例中不是模板模板的参数。它们仅供代码的读者使用,以便更轻松地查看所采用的两个模板参数将映射到什么。 只有一个参数 (the ),即使它看起来像 3。TACtemplate<template<typename T, typename A> class C>template C
1赞 Ted Lyngmo 9/16/2022
@AntonTretyakov 你的意思是你尝试并在那行上遇到了那个错误?如果是这样,那么,我发现这个错误令人困惑,但至少它给出了一个错误,因为它应该只接受一个模板参数,既不接受,也不是 - 只有。C<typename T, typename A> m_children;HasChildrenTAC
1赞 Ted Lyngmo 9/16/2022
@AntonTretyakov 不客气。如果您愿意,我添加了一个替代方案。HasChildren<std::vector<int>> hc;
1赞 Ted Lyngmo 9/16/2022
@AntonTretyakov干杯!当我写的东西有帮助时,总是很高兴!:-)