Скажем, у меня есть шаблон функции, которая устанавливает данные в структуры с помощью указателей на член:Указатели членов или альтернативы?
struct S
{
double d;
unsigned int u;
};
struct A
{
S s, s2;
float f;
int i;
};
template<typename Stream, typename Class, typename Type>
void read(Stream& s, Class& out, Type Class::*member)
{
s >> out.*member;
}
Теперь для постоянных членов, как f
и a
я могу использовать эту функцию на любом экземпляре struct A
:
#include <sstream>
int main(int, char**)
{
std::stringstream stream;
A a;
stream.clear(); stream.str("1");
read(stream, a, &A::i);
stream.clear(); stream.str("1.5");
read(stream, a, &A::f);
stream.clear(); stream.str("2");
printf("%i\n", a.i);
printf("%f\n", a.f);
}
Но есть ли способ получить доступ к членам A::s
или A::s2
подобным образом без писать новую, эффективно идентичную функцию для каждого составного элемента (s
, s2
и т. Д.)? Указатели на членов членов не существуют, насколько мне известно, но есть ли альтернативное решение? (Он должен работать с произвольными экземплярами struct
или class
, аналогично тому, как работает вышеописанное решение указатель-член, и не должно требовать дополнительных методов в A
или S
).
Чтобы уточнить вопрос (см. Также комментарии в this answer): В реальном коде (считыватель конфигурационных файлов) вызывающий выполняет поиск на карте с первой строкой и фактически не знает, что в настоящее время (используя вторую строку), поскольку параметр указатель-член привязан. Также карта инициализируется один раз и используется для нескольких экземпляров A
, поэтому указатели на элементы.
Обратите внимание на тег C++ 03. Поэтому C++ 11 lambdas не являются опцией.
Нет указателя-члена. [Что вы пытаетесь сделать] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)? Это ужасно странный способ заполнить класс. – GManNickG
@GManNickG добавил некоторое разъяснение (и я уже сказал в самом вопросе, что знаю, что такого указателя нет ...) – Joe