Пришла тут в голову одна мысль
//////////////////////////////////////////////////////////////////////////////
struct Foo
{
typedef std::map<ptrdiff_t, char const*> members_map_t;
static members_map_t _members_map;
int a;
std::string b;
std::vector<std::string> c;
double d;
char const* e;
short f[15];
Foo* g;
Foo()
{
if (_members_map.empty())
{
_members_map[ptrdiff_t(&a) - ptrdiff_t(this)] = "a";
_members_map[ptrdiff_t(&b) - ptrdiff_t(this)] = "b";
_members_map[ptrdiff_t(&c) - ptrdiff_t(this)] = "c";
_members_map[ptrdiff_t(&d) - ptrdiff_t(this)] = "d";
_members_map[ptrdiff_t(&e) - ptrdiff_t(this)] = "e";
_members_map[ptrdiff_t(&f) - ptrdiff_t(this)] = "f";
_members_map[ptrdiff_t(&g) - ptrdiff_t(this)] = "f";
}
}
template <typename T>
char const* get_member_str(T const* member)
{
members_map_t::const_iterator member_it
= _members_map.find(ptrdiff_t(member) - ptrdiff_t(this));
return member_it == _members_map.end() ? 0 : member_it->second;
}
void members_str()
{
std::coutl << get_member_str(&a) << std::endl;
std::coutl << get_member_str(&b) << std::endl;
std::coutl << get_member_str(&c) << std::endl;
std::coutl << get_member_str(&d) << std::endl;
std::coutl << get_member_str(&e) << std::endl;
std::coutl << get_member_str(&f) << std::endl;
}
};
//////////////////////////////////////////////////////////////////////////////
Foo::members_map_t Foo::_members_map;
//////////////////////////////////////////////////////////////////////////////
int main(int argc, char** argv)
{
Foo foo1;
std::coutl << foo1.get_member_str(&foo1.a) << std::endl;
std::coutl << foo1.get_member_str(&foo1.b) << std::endl;
std::coutl << foo1.get_member_str(&foo1.c) << std::endl;
std::coutl << foo1.get_member_str(&foo1.d) << std::endl;
std::coutl << foo1.get_member_str(&foo1.e) << std::endl;
std::coutl << foo1.get_member_str(&foo1.f) << std::endl;
Foo foo2;
foo2.members_str();
return 0;
}
Т. е. для каждого члена класса, хранить в map'е строковый идентификатор, используя относительное положение это члена в памяти.
Это удобно использовать, когда класс Foo является хранилищем настроек проекта, которые должны загружаться из или сохраняться в текстовый файл по строковому ключу.
Есть ли в таком решении какие-нибудь подводные камни???
Знающие не говорят, говорящие не знают. Лао Цзы