This is a specific case of this question where that answer doesn't directly work.
struct hurg {};
class furg {
public:
template <class F>
void for_each_hurg(F&& f) const {
for (auto& h : hurgs) {
f(h);
}
}
template <class F>
void for_each_hurg(F&& f) {
for (auto& h : hurgs) {
f(h);
}
}
private:
std::vector<hurg> hurgs;
};
Usage:
furg f;
const auto& cf = f;
f.for_each_hurg([](hurg& h) { });
cf.for_each_hurg([](const hurg& h) { });
The code for the const
and non-const
versions is identical, but only because auto& h
infers const hurg&
in the first case and hurg&
in the second case.
In the spirit of the previously-linked-to Scott Meyers' solution, I came up with the following:
template <class F>
void for_each_hurg(F&& f) {
const_cast<const furg&>(*this).for_each_hurg([&f](const hurg& h) {
f(const_cast<hurg&>(h));
});
}
However, this seems like it could be more trouble than it's worth, especially if the types are long and if I can't use C++14's generic lambdas.