У меня проблема с дублированием идентичного кода для версий const
и non- const
. Я могу проиллюстрировать проблему с некоторым кодом. Вот два примера посетителей: один изменяет посещенные объекты, а другой - нет.
struct VisitorRead
{
template <class T>
void operator()(T &t) { std::cin >> t; }
};
struct VisitorWrite
{
template <class T>
void operator()(const T &t) { std::cout << t << "\n"; }
};
Теперь вот агрегатный объект - в нем всего два элемента данных, но мой код гораздо сложнее:
struct Aggregate
{
int i;
double d;
template <class Visitor>
void operator()(Visitor &v)
{
v(i);
v(d);
}
template <class Visitor>
void operator()(Visitor &v) const
{
v(i);
v(d);
}
};
И функция для демонстрации вышеупомянутого:
static void test()
{
Aggregate a;
a(VisitorRead());
const Aggregate b(a);
b(VisitorWrite());
}
Теперь проблема заключается в дублировании Aggregate::operator()
для версий const
и non- const
.
Можно ли как-то избежать дублирования этого кода?
У меня есть одно решение, которое заключается в следующем:
template <class Visitor, class Struct>
void visit(Visitor &v, Struct &s)
{
v(s.i);
v(s.i);
}
static void test2()
{
Aggregate a;
visit(VisitorRead(), a);
const Aggregate b(a);
visit(VisitorWrite(), b);
}
Это означает, что ни Aggregate::operator()
не требуется, ни дублирования. Но меня не устраивает тот факт, что visit()
является общим, без упоминания типа Aggregate
.
Есть ли способ лучше?