Указатель, как уникальный идентификатор
От: ssi Россия  
Дата: 21.05.06 17:52
Оценка:
Пришла тут в голову одна мысль

//////////////////////////////////////////////////////////////////////////////
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 является хранилищем настроек проекта, которые должны загружаться из или сохраняться в текстовый файл по строковому ключу.

Есть ли в таком решении какие-нибудь подводные камни???
Знающие не говорят, говорящие не знают. Лао Цзы
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.