有没有办法在 Range-v3 中拥有读写视图?
Is there a way to have read-and-write views in Range-v3?
在 Range-v3 中,可以轻松创建现有容器的视图。例如
#include<range/v3/view/transform.hpp>
#include<cassert>
int main(){
std::vector<double> v = {1,2,3};
auto range = v | ranges::v3::view::transform([](auto x){return x*2;});
assert( range[1] == 4 );
// range[1] = 4; // error cannot write to an l-value
}
这些视图自然是只读的。 请问有没有办法在Range-v3中创建读写视图?
我很欣赏这样的事情比只读的要复杂得多,而且并不总是可能的,但我仍然想知道 Range-v3 中是否有一个协议可以直接使用它或实现它。
例如,我看到 ranges::view_facade
的派生 类 实现了一个成员函数 read()
的例子(我找不到这个例子了,Ranges v3 的文档真的很散落一地)。 write(...)
成员函数怎么样?
我正在寻找一些假设的 bi
定向 transform
代码,如下所示:
#include<range/v3/view/transform.hpp>
#include<cassert>
int main(){
std::vector<double> v = {1,2,3};
auto range = v | ranges::v3::view::bitransform([](double x){return x*2;}, [](double x){return x/2;}); // direct and inverse function for read and write
assert( range[1] == 4 );
range[1] = 8; // error cannot write to an l-value
assert( range[1] == 8 );
assert( v[1] == 4 );
}
您可以使 transform_view
具有代理类型的元素:
#include<vector>
#include<range/v3/view/transform.hpp>
#include<cassert>
struct proxy {
double& x;
operator double() { return x*2; }
void operator=(double y) { x = y / 2; }
};
int main(){
std::vector<double> v = {1,2,3};
auto range = v | ranges::v3::view::transform([](auto& x){return proxy{x};});
assert( range[1] == 4 );
range[1] = 8;
assert( range[1] == 8 );
assert( v[1] == 4 );
}
在 Range-v3 中,可以轻松创建现有容器的视图。例如
#include<range/v3/view/transform.hpp>
#include<cassert>
int main(){
std::vector<double> v = {1,2,3};
auto range = v | ranges::v3::view::transform([](auto x){return x*2;});
assert( range[1] == 4 );
// range[1] = 4; // error cannot write to an l-value
}
这些视图自然是只读的。 请问有没有办法在Range-v3中创建读写视图?
我很欣赏这样的事情比只读的要复杂得多,而且并不总是可能的,但我仍然想知道 Range-v3 中是否有一个协议可以直接使用它或实现它。
例如,我看到 ranges::view_facade
的派生 类 实现了一个成员函数 read()
的例子(我找不到这个例子了,Ranges v3 的文档真的很散落一地)。 write(...)
成员函数怎么样?
我正在寻找一些假设的 bi
定向 transform
代码,如下所示:
#include<range/v3/view/transform.hpp>
#include<cassert>
int main(){
std::vector<double> v = {1,2,3};
auto range = v | ranges::v3::view::bitransform([](double x){return x*2;}, [](double x){return x/2;}); // direct and inverse function for read and write
assert( range[1] == 4 );
range[1] = 8; // error cannot write to an l-value
assert( range[1] == 8 );
assert( v[1] == 4 );
}
您可以使 transform_view
具有代理类型的元素:
#include<vector>
#include<range/v3/view/transform.hpp>
#include<cassert>
struct proxy {
double& x;
operator double() { return x*2; }
void operator=(double y) { x = y / 2; }
};
int main(){
std::vector<double> v = {1,2,3};
auto range = v | ranges::v3::view::transform([](auto& x){return proxy{x};});
assert( range[1] == 4 );
range[1] = 8;
assert( range[1] == 8 );
assert( v[1] == 4 );
}