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?
Здравствуйте, licch, Вы писали:
L>При вызове (3), в функции f нужно как-то получить доступ к соответственным (1-2) полям объекта a2. То есть при вызове (1), val в f должно ссылаться на a2.i, при вызове (2) — на a2.c . Можно ли как-нибудь это сделать, не меняя en в структуре A?
Или я чего-то не понимаю, или это делается просто:
Здравствуйте, wander, Вы писали:
W>Здравствуйте, B0FEE664, Вы писали:
BFE>>Или я чего-то не понимаю, или это делается просто: W>У тебя доступ только к a2, а ему надо было к a1 тоже.
В условии этого нет, но если хотите, то вот доступ ко всему:
Здравствуйте, B0FEE664, Вы писали:
BFE>В условии этого нет, но если хотите, то вот доступ ко всему:
Все верно. Я сперва подумал про другое, ошибся. Твой первоначальный вариант как раз то, что надо.
Здравствуйте, 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;
}