c – 换行模式std :: begin;返回开始(c);成功能

前端之家收集整理的这篇文章主要介绍了c – 换行模式std :: begin;返回开始(c);成功能前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有没有办法将模式包装成一般的模板函数
  1. template <typename C>
  2. auto Begin(C&& c) -> ??? {
  3. using std::begin;
  4. return begin(std::forward<C>(c));
  5. }

这里的问题是如何在这里编写函数的返回类型?

我想要这个的原因是我想写一个模板变量

  1. template <typename C>
  2. constexpr bool IsBidirectionalContainer =
  3. std::is_base_of<std::bidirectional_iterator_tag,typename std::iterator_traits<
  4. decltype(std::begin(std::declval<C>()))>::iterator_category>::value;

这里的问题是std :: begin不会通过ADL找到C的开始自定义重载.如果有人为此做了解决方法,也欢迎.

解决方法

您需要将其包装在另一个名称空间中,即:
  1. namespace details {
  2. using std::begin;
  3.  
  4. template <typename C>
  5. auto Begin(C&& c) -> decltype(begin(std::forward<C>(c)))
  6. {
  7. return begin(std::forward<C>(c));
  8. }
  9. }

然后:

  1. template <typename C>
  2. constexpr bool IsBidirectionalContainer =
  3. std::is_base_of<std::bidirectional_iterator_tag,typename std::iterator_traits<
  4. decltype(details::Begin(std::declval<C>()))>::iterator_category>::value;

如果由于某种原因您拒绝在命名空间内定义Begin,则可以使用类型别名来绕过它.

  1. namespace details {
  2. using std::begin;
  3.  
  4. template <typename C>
  5. using type = decltype(begin(std::forward<C>(c)));
  6. }
  7.  
  8. template <typename C>
  9. auto Begin(C&& c) -> details::type<C>
  10. {
  11. return begin(std::forward<C>(c));
  12. }

虽然这可能比必要的工作更多.前瞻声明可能就足够了.

猜你在找的C&C++相关文章