Использование общего кода в разных проектах, где основные типы различаются в C ++ с использованием шаблонов - PullRequest
0 голосов
/ 02 апреля 2019

Я работаю над парой проектов, которые включают общий код. Проекты выполняются с использованием разных ядер со следующими отличиями:

typedef long long i64;
// typedef unsigned long long u64; // In project A
// typedef unsigned long u64;      // In project B
typedef int i32;
typedef unsigned int u32;
typedef short i16;
typedef unsigned short u16;
typedef char i8;
typedef unsigned char u8;
typedef void* Data;
// typedef u32 ptr;                // 32b pointer in project A
// typedef u64 ptr;                // 64b pointer in project B

Но, конечно, в будущем я хочу поддерживать новые ядра с другой конфигурацией.

Я не эксперт по ООО, поэтому я вижу следующие способы справиться с этим:

1) Создайте 2 копии «ProjDefs.h» и включите его из любого места в проекте (в проекте A «ProjDefs.h» будет иметь содержимое, отличное от проекта B). Я считаю, что это неверный путь (но этим занимаются все в моем отделе).

2) Каждый класс должен наследовать от "Object.h", который будет принудительно применять эти конкретные типы и иметь следующий код:

template <typename Core>
class EV_Object{
    typename Core::I64 I64;
    typename Core::U64 U64;
    typename Core::I64 I32;
    typename Core::I64 U32;
    typename Core::I64 I16;
    typename Core::I64 U16;
    typename Core::I64 I8;
    typename Core::I64 U8;
    typename Core::Ptr Ptr;
};

Пусть каждый класс наследует от него, получая, таким образом, правильные определения типов. Проблема:

A) Каждый класс должен наследовать от него.

B) Поскольку это шаблон, я не смогу использовать исходные файлы (только заголовки).

Опять же, я далеко не эксперт по С ++, но это также кажется неправильным.

Есть предложения?

Спасибо, Офер

1 Ответ

1 голос
/ 03 апреля 2019

То, что вам абсолютно необходимо сделать, это отбросить ваши «стандартные локальные гаражные» типы и использовать вместо них stdint.h. Период.

Да, вам нужно изменить всю свою программу - в первую очередь обвините человека, который решил создать свой собственный стандарт шрифта.

Что касается указателей, вы все равно не должны прятать тех, кто стоит за typedef. Если размер самих указателей имеет значение, это кодовый запах. Для очень редкого случая, когда размеры указателя имеют значение, используйте sizeof вместо того, чтобы полагаться на typedefs.

...