有没有办法将模式包装到一个通用的模板函数中?
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
找到 begin
的自定义重载。如果有人对此有解决方法,也欢迎使用。
最佳答案
您需要将它包装在另一个命名空间中,即:
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);进入一个功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48029776/