Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Can';t获取std::less的等价物以用于嵌套迭代器_C++_Templates_Iterator_C++17_Constexpr - Fatal编程技术网

C++ Can';t获取std::less的等价物以用于嵌套迭代器

C++ Can';t获取std::less的等价物以用于嵌套迭代器,c++,templates,iterator,c++17,constexpr,C++,Templates,Iterator,C++17,Constexpr,我正在尝试编写嵌套迭代器模板。因此,您可以迭代std::array>的ints,就像它是单个连续数组一样。但该模板也可以与各种其他组合一起使用 下面是我的代码的简化版本,现在有一个小问题: #包括 #包括 #包括 模板 结构默认值范围{ constexpr自动开始(const T&T)const{ 返回t.begin(); } constexpr自动结束(const T&T)const{ 返回t.end(); } constexpr自动开始(T&T)const{ 返回t.begin(); } c

我正在尝试编写嵌套迭代器模板。因此,您可以迭代
std::array>
int
s,就像它是单个连续数组一样。但该模板也可以与各种其他组合一起使用

下面是我的代码的简化版本,现在有一个小问题:

#包括
#包括
#包括
模板
结构默认值范围{
constexpr自动开始(const T&T)const{
返回t.begin();
}
constexpr自动结束(const T&T)const{
返回t.end();
}
constexpr自动开始(T&T)const{
返回t.begin();
}
constexpr自动结束(T&T)const{
返回t.end();
}
};
模板
constexpr自动内部_impl(){
//要点:这一行是必需的,否则OuterRange将始终与的const&version一起调用
//begin()。
//必须首先在变量中捕获外部变量,以便正确地保持常量
外部=标准::declval();
return*std::declval().begin(外部);
}
模板
使用内部\u t=std::删除\u引用\u t;
模板
使用迭代器_value_t=typename std::迭代器_traits::value_type;
模板
类嵌套迭代器{
私人:
使用InnerIterator=decltype(std::declval().begin(*std::declval());
公众:
使用self_type=nested_迭代器;
使用值\类型=迭代器\值\ t;
使用reference=std::删除_reference_t&;
使用pointer=std::remove_reference_t*;
使用迭代器\u category=std::forward\u迭代器\u标记;
使用差异类型=大小t;
私人:
结构内部迭代器{
内部迭代器位置;
内部迭代器端;
constexpr内部迭代器(InnerIterator pos,InnerIterator end)
:pos{std::move(pos)},end{std::move(end)}
{
}
};
外部编写器外部目标;
外曲器外曲;
std::optional inners=std::nullopt;
内界内界;
公众:
constexpr嵌套迭代器(outiterator outer,outiterator outerEnd)
:outerPos{std::move(outer)},outerEnd{std::move(outerEnd)}
{
//这里的构造函数代码
}
//这里运算符重载
};  // 类迭代器
模板
类嵌套不可数{
私人:
使用内部=内部\u t;
公众:
使用外部迭代器=decltype(std::declval().begin(std::declval());
使用内部迭代器=decltype(std::declval().begin(std::declval());
使用迭代器=嵌套迭代器;
私人:
外*外;
外排外排;
公众:
constexpr嵌套_iterable(外部和外部):外部{&Outer}{}
constexpr迭代器begin()const
{
返回{outerRange.begin(*outer),outerRange.end(*outer)};
}
constexpr迭代器end()const
{
返回{outerRange.end(*outer),outerRange.end(*outer)};
}
};
constexpr无效测试()
{
常量std::数组arr{};
嵌套可数范围{arr};
}

:13:20:错误:“begin”的多个重载实例化为同一签名“auto(const std::array&)const”
constexpr自动开始(T&T)const{
^
:27:39:注意:在这里请求的模板类“default_range”的实例化中
return*std::declval().begin(外部);
...
:110:21:注意:在将推导的模板参数替换为函数模板“”时[使用Outer=const std::array,OuterRange=(无值),InnerRange=(无值)]
嵌套可数范围{arr};
可以很容易地看出,
default\u range
不能为
const std::array
实例化,因为
begin
end
方法在使用
const
类型实例化时变得不明确

default\u range
的思想是,它的工作原理类似于默认的
std::less
,但是用户可以决定自己创建一个
rbegin

这似乎是目前拼图中缺少的部分。我还尝试对这两种引用使用一个
begin
而不是重载,但这也不起作用。在这种情况下,
t
始终需要是一个右值引用


那么,我如何实现
default\u range
,以便它能够与
const
和非
const
类型一起工作呢?

对于
const T
情况,部分地专门化
default\u range
,在这种情况下,您不会重载有问题的函数:

template <typename T>
struct default_range<const T> {
    constexpr auto begin(const T& t) const {
        return t.begin();
    }
    constexpr auto end(const T& t) const {
        return t.end();
    }
};

ranges::view::join
ranges::view::concat
(来自range-v3)可能会引起您的兴趣。谢谢,很遗憾,我还不能使用C++20。
template <typename T>
struct default_range<const T> {
    constexpr auto begin(const T& t) const {
        return t.begin();
    }
    constexpr auto end(const T& t) const {
        return t.end();
    }
};
template <typename Outer, typename OuterRange>
using inner_impl_t = decltype(*std::declval<OuterRange>().begin(std::declval<Outer&>()));