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));
}
この問題を回避する方法はありますか?