我在SO上看过类似的问题,但没有找到我想要做的答案。我有两个typedef,只使用其中一个(其他将被注释掉):
typedef Student StudentType;
typedef StudentPF StudentType;
我想将别名StudentType
用于我目前使用的任何一个。稍后,我有两组不同的代码,我想选择要运行的集合,具体取决于StudentType
是Student
还是StudentPF
(学生作为通过/失败课程)。
有没有办法解决这个问题?
if (StudentType is of type StudentPF)
//do these things
else
//do these different things
我尝试这样做的原因是,如果我保留Student
和{{1}的标题,我只需简单地注释掉一行并在另一行中发表评论即可更改程序的行为包括在内。
答案 0 :(得分:4)
编写功能模板。专门针对您感兴趣的每种类型。使用您的typedef类型实例化它。
template<typename T>
void DoStuff();
template<>
void DoStuff<Student>()
{
...
}
template<>
void DoStuff<StudentPF>()
{
...
}
int main()
{
DoStuff<StudentType>();
}
答案 1 :(得分:3)
显然,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
子句中的代码不能为“错误”类型编译,那么这些都不会起作用。在这种情况下,您需要某种静态调度功能。
答案 2 :(得分:1)
您可以使用标准type traits:
if (std::is_same<StudentType, StudentPF>::value)
//do these things
else
//do these different things