使用伪容器或迭代器适配器并非绝对必要,例如 boost::iterator_range。虽然使用适当的适配器(如 iterator_range)理论上会更正确和通用,并且不会违反应用于对象的最少知识原则,但您可能希望避免它,因为额外的间接性,或者可能是因为您的迭代器通常只单程范围,而不是前进范围。
因此,如果您希望直接使用调整后的范围,您可以简单地使用decltype
来推断适配器已经返回的迭代器类型:
#include <iostream>
#include <map>
#include <boost/range/adaptor/map.hpp>
class A {
std::map<int,int> my_map = { {0, 1}, {2, 3} };
public:
decltype(my_map | boost::adaptors::map_values)
values() { return my_map | boost::adaptors::map_values; }
};
int main() {
for (const auto& v : A().values())
std::cout << "v = " << v << std::endl;
return 0;
}
/* Output:
v = 1
v = 3
*/
如果你希望暴露的值是一个 const 成员函数,它会稍微复杂一些:
class A {
...
decltype(const_cast<const std::map<int,int>&>(my_map) | boost::adaptors::map_values)
values() const { return my_map | boost::adaptors::map_values; }
}