Это конкретный случай this question, где that answer не работает напрямую.Как избежать дублирования кода между аналогичными функциями const и non-const, которые передают членам класса обратные вызовы?
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;
};
Использование:
furg f;
const auto& cf = f;
f.for_each_hurg([](hurg& h) { });
cf.for_each_hurg([](const hurg& h) { });
Код для версий const
и не- const
одинакова, но только потому, что auto& h
выводит const hurg&
в первом случае и hurg&
во втором дело.
В духе ранее связанный к Scott Meyers' solution, я придумал следующее:
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));
});
}
Однако, это, кажется, что это может быть больше проблем, чем это стоит, особенно если типы длинны и если я не могу использовать общие лямбды C++ 14.
Вы можете использовать шаблон функции друга с идеальной пересылкой. – dyp
Не могли бы вы прояснить разницу между вашим вопросом и тем, который вы указали? Я вижу, что вы используете шаблон функции (участника), тогда как в другом вопросе используется «обычная» (членная) функция; но есть подходы, которые работают для обоих. – dyp
@ dyp: Ahh [нравится так] (https://ideone.com/i4AVT4)? В основном, два лучших ответа там не будут работать в этом случае (потому что обратный вызов в неконстантной версии все равно будет передаваться константными переменными-членами), поэтому я задавался вопросом, был ли более хороший способ сделать это, чем мое решение. Мне нравится подход к шаблону функции друзей - я не думаю, что там есть функции ответа. (На самом деле кажется приятнее, если я делаю это статической частной функцией.) – Claudiu