繁体   English   中英

如何为自定义容器的迭代器重载模板函数

[英]How to make an overload for templated functions for a custom container's iterator

这是关于模板的一般问题,我以 advance 为例。 假设有一些原因我不能在这里使用 ADL 或隐藏的朋友。

std::advance的定义是:

template< class InputIt, class Distance >
constexpr void advance( InputIt& it, Distance n );

为了争论,假设我有一个容器 H,带有迭代器,出于某种原因我想重载std::advance用于:

template <typename T, class Allocator=std::allocator<T>>
class H
{
  // etc
  class iterator;
};

如何设计一个高级重载来匹配该迭代器,并在 H 的迭代器 class 上调用高级时正确地拥有 C++ select 重载? 下面的代码不起作用,因为在模板中只指定了 H,而不是迭代器本身:

template< template <typename, class> class container, class T, class Allocator, class Distance >
constexpr void advance( container<T, Allocator>::iterator& it, Distance n );

我不太清楚如何在模板行中专门指定迭代器。

我的一个朋友想出了一个基于标签(空结构)的解决方案。

基本上,在迭代器 class 中放置一个唯一的空结构,然后使用它构建一个 C++20 概念,然后使用它来匹配模板重载:

   template <typename T, class A = std::allocator<T>>
   class H
   {
      // etc
   public:
      class iterator
      {
      public:
         struct cheat_tag {};
         // etc
      };
   };

   template<class T>
   concept h_iterator = requires { typename T::cheat_tag; };

   namespace std
   {
      template <h_iterator T, class D>
      constexpr void advance(T&, D)
      {
         // etc
      }
   }

如果您与要重载的模板的签名完全匹配,这应该可行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM