If-else基于使用的typedef

时间:2014-05-25 04:31:50

标签: c++ typedef typeof

我在SO上看过类似的问题,但没有找到我想要做的答案。我有两个typedef,只使用其中一个(其他将被注释掉):

typedef Student StudentType;
typedef StudentPF StudentType;

我想将别名StudentType用于我目前使用的任何一个。稍后,我有两组不同的代码,我想选择要运行的集合,具体取决于StudentTypeStudent还是StudentPF(学生作为通过/失败课程)。

有没有办法解决这个问题?

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

我尝试这样做的原因是,如果我保留Student和{{1}的标题,我只需简单地注释掉一行并在另一行中发表评论即可更改程序的行为包括在内。

3 个答案:

答案 0 :(得分:4)

编写功能模板。专门针对您感兴趣的每种类型。使用您的typedef类型实例化它。

template<typename T>
void DoStuff();

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

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

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

答案 1 :(得分:3)

显然,StudentStudentPF并非完全可以互换。所以他们应该在他们的公共界面中有一些东西让你分开。也许是这样的:

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)
        ;
}

但是,如果您无法更改StudentStudentPF,则始终会:

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

如果ifelse子句中的代码不能为“错误”类型编译,那么这些都不会起作用。在这种情况下,您需要某种静态调度功能。

答案 2 :(得分:1)

您可以使用标准type traits

if (std::is_same<StudentType, StudentPF>::value)
    //do these things
else
    //do these different things