使用提升范围实现LINQ选择

Implementing LINQ select using boost range

本文关键字:实现 LINQ 选择 范围      更新时间:2023-10-16

我正在尝试实现一个围绕boost::range的LINQ包装器。

然而,当我选择"编译器中发生内部错误"时,我感到震惊。

template<typename R>
class linq_range
{
    R range;
public:
    linq_range(R range)
        : range(std::move(range))
    {
    }
    template<typename F>
    auto select(const F& f) const -> linq_range<decltype(std::declval<R>() | boost::adaptors::transformed(f))>
    {
        return linq_range<decltype(std::declval<R>() | boost::adaptors::transformed(f))>(this->range | boost::adaptors::transformed(f));
    }
};
template<typename R>
auto from(R& r) -> linq_range<boost::iterator_range<decltype(std::begin(r))>>
{
    return from(std::begin(r), std::end(r));
}
template<typename I>
linq_range<boost::iterator_range<I>> from(I b, I e)
{
    return linq_range<boost::iterator_range<I>>(boost::iterator_range<I>(b, e));
}

有什么办法解决这个问题吗?

我通过定义来解决它:

BOOST_RESULT_OF_USE_DECLTYPE