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

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

概述有没有办法将模式包装成一般的模板函数? template <typename C>auto Begin(C&& c) -> ??? { using std::begin; return begin(std::forward<C>(c));} 这里的问题是如何在这里编写函数的返回类型? 我想要这个的原因是我想写一个模板变量 template <typename C>constexpr 有没有办法将模式包装成一般的模板函数?
template <typename C>auto Begin(C&& c) -> ??? {  using std::begin;  return begin(std::forward<C>(c));}

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

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

template <typename C>constexpr bool IsBIDirectionalContainer =   std::is_base_of<std::bIDirectional_iterator_tag,typename std::iterator_traits<                      decltype(std::begin(std::declval<C>()))>::iterator_category>::value;

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

解决方法 您需要将其包装在另一个名称空间中,即:
namespace details {    using std::begin;    template <typename C>    auto Begin(C&& c) -> decltype(begin(std::forward<C>(c)))    {        return begin(std::forward<C>(c));    }}

然后:

template <typename C>constexpr bool IsBIDirectionalContainer =   std::is_base_of<std::bIDirectional_iterator_tag,typename std::iterator_traits<                      decltype(details::Begin(std::declval<C>()))>::iterator_category>::value;

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

namespace details {     using std::begin;     template <typename C>     using type = decltype(begin(std::forward<C>(c)));}template <typename C>auto Begin(C&& c) -> details::type<C>{     return begin(std::forward<C>(c));}

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

总结

以上是内存溢出为你收集整理的c – 换行模式std :: begin;返回开始(c);成功能全部内容,希望文章能够帮你解决c – 换行模式std :: begin;返回开始(c);成功能所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1242026.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存