Привет Есть 3 структуры (основные) и одна базовая. Код (Text): typedef struct _TBASE { unsigned _int64 qFlags; bool blEnabled; } TBASE, *PTBASE; Код (Text): typedef struct _T1: public TBASE { int a; int b; char x; char y; }; Код (Text): typedef struct _T2: public TBASE { short b; short a; char x; char y; }; Код (Text): typedef struct _T3: public TBASE { int b; short a; char y; char x; }; 3 структуры полностью идентичны. Имена элементов одни и те же. Разница между ними лишь в порядке элементов и в их размере. Количество элементов в структуре в действительности больше, чем я привел в примере. Реальное количество элементов около 200. Но принцип все тот же. Имена элементов во всех структурах совпадает. Тип структуры зависит от элемента qFlags, который ВСЕГДА идет первым и который явно говорит, что за структура в файле. Мне нужно в своем коде получать и перезаписвывать некоторые элементы. И каждый раз делать switch/case мне не удобно. Хочется написать обработчик, который сам определит нужный тип структуры и запишет нужный элемент. Делать 200 геттеров/сеттеров тоже не хотелось бы. 200 свитч/кейзов в обработчике тоже не хочу. Есть ли какой-то простой способ, который позволил бы в зависимости от ситуации обращаться к нужной структуре?
могу предложить так Код (Text): struct C1 { int a; char b; }; struct C2 { int b; char a; }; #define DECLARE_GET(name) \ template <typename T, typename V> \ void get_##name(T &t, V &val) \ { \ val = t.name; \ } DECLARE_GET(a); DECLARE_GET(b); int _tmain(int argc, _TCHAR* argv[]) { C1 c1; int x; get_a(c1, x); get_b(c1, x); C2 c2; int y; get_a(c2, y); return 0; } геттеры придётся всё-же объявлять
Как правило это признак плохого. Если бы вы объяснили, что вы хотите сделать... Сомнительно, что можно однотипно работать с таким набором.
Не совсем понятно как вы именно вы собираетесь "получать и перезаписывать некоторые элементы" чем-то универсальным, т.к. размер элементов у вас для каждого типа разный: что вы будете получать с поля "х" int или short, в зависимости от этого может и логика разной быть. Соответственно, должен быть написан отдельный код для каждой из 3х структур. Используйте паттерн "Factory" и реализуйте логику для каждой из структур, там где логика обработки идентична (совпадает размер данных, например) - выносите в общий интерфейс базового класса.
Magnum Код (Text): Вопрос по классам знатокам С++ С таким заголовком в конце сообщения должна быть фраза: "А теперь, уважаемые знатоки, внимание вопрос!". А вообще гамнакот конечно жжот. Одна только стилистика объявления структуры чего стоит. Собственно, в чем вопрос-то? Зачем с таким кодом какие-то там геттеры? Почему просто не писать напрямую в поля по их именам?
Классический пример: Есть OPTIONAL_IMAGE_HEADER32 и OPTIONAL_IMAGE_HEADER64 Нужно к примеру перезаписать размер хипа. Мой пример: Есть файл, в нем заголовок. Три типа заголовка. В зависимости от типа файла. Мне нужно считать/переписать некоторые поля в заголовке. Т.е. сами структуры уже даны и переписывать я их не смогу. Но под каждую структуру дублировать код тоже не хочется, потому что структуры фактически идентичны.
шаблонную функцию обработки (изменения полей) Код (Text): template< typename T > SetFields(T& header) { header->field=somevalue; } Вот и не надо ммм??
punxer Мне неловко за глупые вопросы. Но я кодю на чистом С и С++ для меня в новинку. Можно простой конкретный пример, как для IMAGE_OPTIONAL_HEADER32 и IMAGE_OPTIONAL_HEADER64 сделать шаблонную функцию для изменения в них полей. Например размера стека или хипа. И как ее вызывать.
Код (Text): template <typename TImageOptionalHeader> inline void SetSizeOfStackReserve(TImageOptionalHeader &header, DWORD dwValue) { header.SizeOfStackReserve = dwValue; } int main() { IMAGE_OPTIONAL_HEADER h32; SetSizeOfStackReserve(h32, 0x1000000); IMAGE_OPTIONAL_HEADER64 h64; SetSizeOfStackReserve(h64, 0x1000000); }