是否可以在函数外部使用if语句(如main)?

时间:2016-07-22 22:24:26

标签: c++ if-statement static queue

我正在实施一个BOOOS - 基于面向对象的操作系统,现在我需要让我的程序调度程序在FCFS和Priority之间进行选择。我有一个名为Task的类,我创建了两个队列:std::queuestd::priority_queue。这些队列是在Task.h中声明的静态成员,我需要在Task.cc中的任何其他东西之前与该类的其他静态成员进行初始化,如下所示:

namespace BOOOS {

    volatile Task * Task::__running;
    Task * Task::__main;
    int Task::__tid_count;
    int Task::__task_count;
    std::queue<Task*> Task::__ready;
    std::priority_queue<Task*> Task::__ready;

    (rest of the Task.cc)

}

你可以看到我有两个__ready队列。这就是为什么我只需要使用其中一个。如果用户想要初始化FCFS调度程序,我使用没有优先级的那个,如果用户想要优先级调度程序,我使用priority_queue。这是由BOOOS的静态枚举成员控制的。所以,这是我的问题:我可以在代码的这一部分使用类似if的内容来选择一个队列而不是创建两个队列,并且每次我需要在我的程序中操作它时创建一个if吗?

1 个答案:

答案 0 :(得分:6)

使用if()声明无法做到这一点。这些实际上需要放在函数体内。

您的选择

  • 使用C预处理器并有一个

    #if !defined(USE_PRIORITY_QUEUE)
    std::queue<Task*> Task::__ready;
    #else
    std::priority_queue<Task*> Task::__ready;    
    #endif
    

    预处理程序指令。

  • 使用模板类和专业化

    template<bool use_priority_queue>
    struct TaskQueueWrapper {
         typedef std::queue<Task*> QueueType;
    };
    
    template<>
    struct TaskQueueWrapper<true> {
         typedef std::priority_queue<Task*> QueueType;
    };
    
    TaskQueueWrapper<true>::QueueType Task::__ready;