Я видел подобные вопросы на 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
включен.
Написать шаблон функции. Специализируйте его для каждого интересующего вас типа. Создайте его с помощью типа typedef.
template<typename T>
void DoStuff();
template<>
void DoStuff<Student>()
{
...
}
template<>
void DoStuff<StudentPF>()
{
...
}
int main()
{
DoStuff<StudentType>();
}
Очевидно, что 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
условие не будет компилироваться для «неправильного» типа. В этом случае вам понадобится какая-то статическая функция диспетчеризации.
Вы можете использовать стандарт тип черты за это :
if (std::is_same<StudentType, StudentPF>::value)
//do these things
else
//do these different things