虽然像这样的转换迭代器实现boost::transform_iterator
肯定很有用,但我发现的所有实现似乎都有一个共同的弱点:它们只提供operator*
,而没有operator->
。
给定一个返回引用的转换函数,实现起来operator->
很简单。
给定一个按值返回的转换函数,operator->
使用代理实现也应该不是问题。
为什么认为最好只提供一个operator*
,而不提供operator->
?这里使用代理与例如有什么不同std::vector<bool>
吗?
更新:这是一个非常简单的概念证明,用于演示这样的代理对象如何工作(针对std::string
类型进行硬编码):
#include <iostream>
#include <functional>
#include <string>
class StringProxyDemo {
public:
class Proxy {
public:
Proxy(std::string value) : _value(std::move(value)) { }
std::string *operator->() { return &_value; }
private:
std::string _value;
};
Proxy operator->() { return _function(); }
StringProxyDemo(std::function<std::string()> function)
: _function(std::move(function)) { }
private:
std::function<std::string()> _function;
};
int main() {
StringProxyDemo demo(
[]() -> std::string {
return "Hello, World!";
}
);
std::cout << demo->size() << std::endl;
std::cout << demo->c_str() << std::endl;
}