If-else в зависимости от того, какой typedef используется

Я видел подобные вопросы на SO, но не нашел ответа на то, что я собираюсь сделать. У меня есть две typedef, только одна из которых будет использоваться (другая будет закомментирована):

typedef Student StudentType;
typedef StudentPF StudentType;

Я хочу использовать псевдоним StudentType для того, который я сейчас использую. Позже у меня есть два разных набора кода, и я хочу выбрать, какой набор запустить, в зависимости от того, StudentType это Student или StudentPF (Студент, проходящий курс как Pass / Fail).

Есть ли способ получить что-то на этот счет?

if (StudentType is of type StudentPF)
//do these things
else
//do these different things

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

1

Решение

Написать шаблон функции. Специализируйте его для каждого интересующего вас типа. Создайте его с помощью типа typedef.

template<typename T>
void DoStuff();

template<>
void DoStuff<Student>()
{
...
}

template<>
void DoStuff<StudentPF>()
{
...
}

int main()
{
DoStuff<StudentType>();
}
4

Другие решения

Очевидно, что Student а также StudentPF не являются полностью взаимозаменяемыми. Таким образом, они должны иметь что-то в своих общедоступных интерфейсах, позволяющих вам отличить их друг от друга. Может быть что-то вроде:

class Student {
public:
constexpr static bool is_pf = false;
// ...
};

class StudentPF {
public:
constexpr static bool is_pf = true;
// ...
};

void my_func() {
if (StudentType::is_pf)
;
}

Но если вы не можете изменить Student или же StudentPFвсегда есть:

#include <type_traits>
void my_func() {
if (std::is_same<StudentType, StudentPF>::value)
;
}

Ни один из них не будет работать, если код в if или же else условие не будет компилироваться для «неправильного» типа. В этом случае вам понадобится какая-то статическая функция диспетчеризации.

3

Вы можете использовать стандарт тип черты за это :

if (std::is_same<StudentType, StudentPF>::value)
//do these things
else
//do these different things
1
По вопросам рекламы [email protected]