Member на другой экземпляр объекта
От: licch Россия  
Дата: 12.08.11 04:55
Оценка:
Есть следующий код:
struct A {
    int i;
    char c;

    template<typename Caller>
    void en(Caller & caller)
    {
        caller.f(i); // (1)
        caller.f(c); // (2)
    }
};

struct SomeCaller {
    SomeCaller(A & a_) : a(a_) {}
    template<typename T>
    void f(/* ??? */ & val)
    {
        // Здесь нужно получить доступ на соответственный member из объекта a
    }
    A & a;
};

int main()
{
    A a1, a2;
    // ...
    a1.en(SomeCaller(a2)); // (3)
    return 0;
}

При вызове (3), в функции f нужно как-то получить доступ к соответственным (1-2) полям объекта a2. То есть при вызове (1), val в f должно ссылаться на a2.i, при вызове (2) — на a2.c . Можно ли как-нибудь это сделать, не меняя en в структуре A?
Re: Member на другой экземпляр объекта
От: B0FEE664  
Дата: 12.08.11 10:49
Оценка: +1
Здравствуйте, licch, Вы писали:

L>При вызове (3), в функции f нужно как-то получить доступ к соответственным (1-2) полям объекта a2. То есть при вызове (1), val в f должно ссылаться на a2.i, при вызове (2) — на a2.c . Можно ли как-нибудь это сделать, не меняя en в структуре A?


Или я чего-то не понимаю, или это делается просто:

struct A {
    int i;
    char c;

    template<typename Caller>
    void en(Caller & caller)
    {
        caller.f(i); // (1)
        caller.f(c); // (2)
    }
};

struct SomeCaller {
    SomeCaller(A & a_) : a2(a_) {}
    void f(int c_valA1_ignored)
    {
        a2.i = 2;
    }
    void f(char c_valA1_ignored)
    {
        a2.c = '2';
    }
    A & a2;
};

int main()
{
    A a1, a2;
    // ...
    a1.en(SomeCaller(a2)); // (3)
    return 0;
}
И каждый день — без права на ошибку...
Re[2]: Member на другой экземпляр объекта
От: wander  
Дата: 12.08.11 14:13
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Или я чего-то не понимаю, или это делается просто:

У тебя доступ только к a2, а ему надо было к a1 тоже.
Re[3]: Member на другой экземпляр объекта
От: B0FEE664  
Дата: 12.08.11 15:23
Оценка: +1
Здравствуйте, wander, Вы писали:

W>Здравствуйте, B0FEE664, Вы писали:


BFE>>Или я чего-то не понимаю, или это делается просто:

W>У тебя доступ только к a2, а ему надо было к a1 тоже.
В условии этого нет, но если хотите, то вот доступ ко всему:

struct A {
    int i;
    char c;

    template<typename Caller>
    void en(Caller & caller)
    {
        caller.f(i); // (1)
        caller.f(c); // (2)
    }
};

struct SomeCaller {
    SomeCaller(A & a_) : a2(a_) {}
    void f(int& a1_i)
    {
        a1_i = 1;
        a2.i = 2;
    }
    void f(char& a1_c)
    {
        a1_c = '1';
        a2.c = '2';
    }
    A & a2;
};

int main()
{
    A a1, a2;
    // ...
    a1.en(SomeCaller(a2)); // (3)
    return 0;
}
И каждый день — без права на ошибку...
Re[4]: Member на другой экземпляр объекта
От: wander  
Дата: 12.08.11 20:45
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>В условии этого нет, но если хотите, то вот доступ ко всему:

Все верно. Я сперва подумал про другое, ошибся. Твой первоначальный вариант как раз то, что надо.
Re[2]: Member на другой экземпляр объекта
От: licch Россия  
Дата: 14.08.11 04:38
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Здравствуйте, licch, Вы писали:


L>>При вызове (3), в функции f нужно как-то получить доступ к соответственным (1-2) полям объекта a2. То есть при вызове (1), val в f должно ссылаться на a2.i, при вызове (2) — на a2.c . Можно ли как-нибудь это сделать, не меняя en в структуре A?


BFE>Или я чего-то не понимаю, или это делается просто:


я не совсем точно описал. Структура A, в общем случае, может быть произвольной и в ней могут быть повторяющиеся по типу поля. Но в A всегда есть функция en, которая перечисляет все эти поля. Например, может быть так:

struct A {
    int i1, i2;
    char c;
    bool b1, b2;

    template<typename Caller>
    void en(Caller & caller)
    {
        caller.f(i1); // (1)
        caller.f(i2);
        caller.f(c); // (2)
        caller.f(b1);
        caller.f(b2);
    }
};

struct SomeCaller {
    SomeCaller(A & a_) : a(a_) {}
    template<typename T>
    void f(/* ??? */ & val)
    {
        // Здесь нужно получить доступ на соответственный member из объекта a
    }
    A & a;
};

int main()
{
    A a1, a2;
    // ...
    a1.en(SomeCaller(a2)); // (3)
    return 0;
}


В этом случае перегрузка не сработает.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.