Позвольте иметь тип T и структуру, имеющую ТОЛЬКО однородные элементы типа T.
struct Foo {
T one,
T two,
T three
};
Я бы хотел получить к ним доступ следующим образом:
struct Foo {
T one,
T two,
T three
T &operator [] (int i)
{
return *(T*)((size_t)this + i * cpp_offsetof(Foo, two));
}
};
где *Макрос 1007 * (считается правильным):
#define cpp_offsetof(s, m) (((size_t)&reinterpret_cast<const volatile char&>((((s*)(char*)8)->m))) - 8)
Стандарт C ++ не гарантирует этого, но можем ли мы предположить, что члены отстоят друг от друга с фиксированным смещением, а вышеприведенное является правильнымПлатформенное решение?
100% совместимое решение будет:
struct Foo {
T one,
T two,
T three
T &operator [] (int i) {
const size_t offsets[] = { cpp_offsetof(Foo, one), cpp_offsetof(Foo, two), cpp_offsetof(Foo, three) };
return *(T*)((size_t)this + offsets[i]);
}
};
[править] Стандартная, совместимая и более быстрая версия была представлена snk_kidиспользование указателей на элементы данных [/ edit]
, но для этого требуется дополнительная таблица поиска, которую я стараюсь избегать.
// EDIT
И еще один,Я не могу использовать только массив и константы для индексации этих полей, они должны быть именованными полями структуры (некоторые макросы требуют этого).
// EDIT2
Почему те должны быть названы полямиструктура?Что такое макрос?Это система настроек большого проекта.Упрощенно это выглядит так:
struct Foo {
int one;
int two;
}
foo;
struct Setting { void *obj, size_t filed_offset, const char *name, FieldType type }
#define SETTING(CLASS, OBJ, FIELD, TYPE) { OBJ, cpp_offsetof(CLASS, FIELD), #OBJ #FIELD, TYPE }
Setting settings[] = {
SETTING(Foo, foo, one, INT_FIELD),
SETTING(Foo, foo, two, INT_FIELD)
};
И еще раз: я ищу не 100% совместимое решение, а 99%.Я спрашиваю, можем ли мы ожидать, что некоторые компиляторы поместят неравномерное заполнение между однородными полями.