2014-09-10 4 views
-1

Я работаю над настраиваемым движком, где у меня есть 2 разных класса преобразования, один для 2D и один для 3D. Я использую #define, чтобы выбрать, какой класс преобразования использовать и использовать это определение вместо имени класса в тех местах, где логика должна быть одинаковой. Сейчас я нахожусь в роли, где хочу, чтобы у них была другая логика, и я хотел сделать сравнение, чтобы отделить это. Что мне нужно сделать, чтобы заставить это работать?Сравнение типов в C++

class Transform2D; 
class Transform3D; 

#define TransformClass Transform2D 

if(TransformClass == Transform2D) 
{ 
    //like this 
} 
else  
{ 
    //like that 
} 

Тип id работал для этого. Как вы справляетесь?

if (typeid(TransformClass) == typeid(Transform2D)) 
{ 
    ittransform->SetRotation(0); 
    ittransform->SetScale(Vector2D(defaultScale, defaultScale)); 
} 
else 
{ 
    ittransform->SetRotation(Vector3f()); 
    ittransform->SetScale(Vector3f(defaultScale, defaultScale, defaultScale)); 
} 
+0

Этот тип проверки типа обычно является показателем плохой архитектуры/класса. Либо используйте перегруженные функции, как предложил Шон, или определите класс интерфейса верхнего уровня, который реализуется либо преобразованием2D, либо transform3D. – glampert

+0

Вместо #define просто создайте свою функцию шаблоном, который работает на обоих классах Transform2D/3D, используя общий интерфейс, такой как Sean предложил. – JarkkoL

ответ

6

Используйте функцию декомпозиции (переломите свою логику в подфункции), а затем используйте перегрузку.

void do_something(Transform2D const& t) { 
    ... 
} 

void do_something(Transform3D const& t) { 
    ... 
} 

void test() { 
    TransformClass tc = ... 
    do_something(tc); // invokes the desired overload 
} 

Кроме того, используйте идентификатор typedef или type вместо определения, например.

#if defined(USE_3D) 
using TransformClass = Transform3D; 
#else 
using TransformClass = Transform2D; 
#endif 

Вы также можете определить псевдоним с помощью станда :: условного и еще более функционален-у и C++ - у.

+0

Использует ли TransformClass = Transform2D; 'то же, что и #define, или у него больше/различное поведение. –

+0

@ColinAvrech: У него есть _slightly_ другое поведение. А именно, если вы называете переменную 'TransformClass', она на самом деле называется' TransformClass', а не 'Transform3D'. Еще несколько отличий. –

+0

Что такое жаргон/термин для этого использования? –

0

Я думаю, что самый простой вариант, чтобы создать дополнительные определения, что-то вроде этого:

#define USING_CLASS_2D 1 

#if USING_CLASS_2D 
#define TransformClass Transform2D 
#else 
#define TransformClass Transform3D 
#endif 

if (USING_CLASS_2D) 
{ 
} 
else 
{ 
} 
+1

Если вы примете этот подход, то зачем использовать 'if()' логику? В этом случае правильным будет препроцессор '# if' или' # ifdef'. – glampert

+0

Зачем это нужно для 'typedef'? – 2014-09-10 23:10:25

+0

Я использовал '# define' и' if', так как это было использовано в вопросе. Вместо этого вы можете использовать typedef. – Adam

1

Не используйте, если() в этой ситуации.

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

# if USING_3D 
    3d code 
# else 
    2d code 
# endif 

и если вы стремитесь сохранить большинство методов и вспомогательных классов, которые ищут в целом то же самое, вы, вероятно, удадитесь избегать слишком большого использования #if

Старый код C был завален этим материалом, и это считалось хорошим. Однако в наши дни это очень старомодно. Подумайте трижды, прежде чем продолжать этот путь.

Смежные вопросы