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);成功能所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)