【问题标题】:Template for container and container content type C++容器和容器内容类型 C++ 的模板
【发布时间】:2020-09-24 20:53:01
【问题描述】:

我基本上想要

template <typename Container, typename T>
void copy(Container<T> &A, const Container<T> &B)
{
   (copy contents from B to A) ...
}

但是,afaik,它不能这样做。使用方面,它会从(示例)vector&lt;int&gt; A, B 复制内容,但也适用于 list&lt;float&gt; A, B,例如。

因此,单个函数将适用于不同类型的容器以及它们各自容器的不同数据类型。

【问题讨论】:

  • 旁注:如果你创建一个通用迭代器接口,你可以拥有一个不关心容器是什么的函数。 See C++'s own std::copy 举个例子,包括一些你可以兴高采烈地窃取想法的示例实现。
  • 旁注:在 C++ 标准库中,参数的顺序是相反的,所以你的函数很可能会引起用户的一些混淆。我建议从第一个复制到第二个。 A -&gt; B.
  • @EthanR,我的推销会改变函数的外观,类似于void copy(iterator from_start, iterator from_end, iterator to_start)

标签: c++ templates containers


【解决方案1】:

您需要将Container 设为template template parameter

template <template<typename...> typename Container, typename T>
Container<T> copy(Container<T> A, Container<T> B)
{
   // (copy contents from B to A) ...
}

或者,你可以简单地写:

template <typename Container>
Container copy(Container A, Container B)
{
   // (copy contents from B to A) ...
}

如果您不需要显式命名元素类型T。无论如何,您仍然可以通过 Container::value_type 获得这种类型。

【讨论】:

  • 你能解释一下这背后的逻辑吗?还是有专门的文章讨论这个?我想了解为什么我需要这样做,因为它在语法上对我来说没有意义。
  • 我添加了一个链接,那里有例子。基本上,你需要说Container&lt;T&gt;,并且你只能在Container 本身就是一个模板的情况下这样做。
  • 谢谢!我编辑了原始帖子。我意识到它返回的是 void,而不是容器。
  • @EthanR 没问题。通常,您不应在发布答案后编辑问题,但这次没关系,因为该部分与您的问题并不真正相关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-10
  • 2011-06-22
  • 1970-01-01
  • 2013-09-05
  • 1970-01-01
  • 1970-01-01
  • 2021-04-16
相关资源
最近更新 更多