Plantilla C ++ para cubrir métodos const y no const

Tengo un problema con la duplicación de código idéntico paraconst y noconst versiones. Puedo ilustrar el problema con algún código. Aquí hay dos visitantes de muestra, uno que modifica los objetos visitados y otro que no.

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"; }
};

Ahora hay un objeto agregado: tiene solo dos miembros de datos, pero mi código real es mucho más complejo:

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);
    }
};

Y una función para demostrar lo anterior:

static void test()
{
    Aggregate a;
    a(VisitorRead());
    const Aggregate b(a);
    b(VisitorWrite());
}

Ahora, el problema aquí es la duplicación deAggregate::operator() paraconst y noconst versiones.

¿De alguna manera es posible evitar la duplicación de este código?

Tengo una solución que es esta:

template <class Visitor, class Struct>
void visit(Visitor &v, Struct &s) 
{
    v(s.i);
    v(d.i);
}

static void test2()
{
    Aggregate a;
    visit(VisitorRead(), a);
    const Aggregate b(a);
    visit(VisitorWrite(), b);
}

Esto significa que tampocoAggregate::operator() es necesario y no hay duplicación. Pero no me siento cómodo con el hecho de quevisit() es genérico sin mencionar el tipoAggregate.

¿Hay una mejor manera?

Respuestas a la pregunta(7)

Su respuesta a la pregunta