有没有办法将模式包装成一般的模板函数?
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;
解决方法
您需要将其包装在另一个名称空间中,即:
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)); }
虽然这可能比必要的工作更多.前瞻声明可能就足够了.