Вы можете написать шаблон класса auto_iterator_impl
и использовать его через шаблон функции auto_iterator
, который возвращает экземпляр auto_iterator_impl
, который можно неявно преобразовать в true
или false
:
Рабочая реализация с минимальными функциональными возможностями и учетом:
template<typename C>
struct auto_iterator_impl
{
C & c;
typename C::iterator it;
auto_iterator_impl(C & c, typename C::iterator & it) : c(c), it(it) {}
operator bool() const { return it != c.end(); }
typename C::iterator operator->() { return it; }
};
template<typename C>
auto_iterator_impl<C> auto_iterator(C & c, typename C::iterator it)
{
return auto_iterator_impl<C>(c, it);
}
Тестовый код:
void test(std::map<int, int> & m, int key)
{
if (auto x = auto_iterator(m, m.find(key)))
{
std::cout << "found = " << x->second << std::endl;
x->second *= 100; //change it
}
else
std::cout << "not found" << std::endl;
}
int main()
{
std::map<int,int> m;
m[1] = 10;
m[2] = 20;
test(m, 1);
test(m, 3);
test(m, 2);
std::cout <<"print modified values.." <<std::endl;
std::cout << m[1] << std::endl;
std::cout << m[2] << std::endl;
}
Вывод:
found = 10
not found
found = 20
print modified values..
1000
2000
Демонстрационная версия онлайн: http://www.ideone.com/MnISh