Mat*_*eim 1 c++ queue static if-statement
我正在实现一个BOOOS - 基于面向对象的操作系统,现在我需要让我的程序调度程序在FCFS和Priority之间进行选择.我有一个名为Task的类,我创建了两个队列:std::queue和a std::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)
}
Run Code Online (Sandbox Code Playgroud)
你可以看到我有两个__ready队列.这就是为什么我只需要使用其中一个.如果用户想要初始化FCFS调度程序,我使用没有优先级的那个,如果用户想要优先级调度程序,我使用priority_queue.这是由BOOOS的静态枚举成员控制的.所以,这是我的问题:我可以if在代码的这一部分中使用类似的东西来选择只有一个队列而不是创建两个队列并且if每次我需要在我的程序中操作它吗?
不,通过使用if()声明是不可能的.这些需要实际放在函数体内.
你的选择是
使用C预处理器并拥有一个
#if !defined(USE_PRIORITY_QUEUE)
std::queue<Task*> Task::__ready;
#else
std::priority_queue<Task*> Task::__ready;
#endif
Run Code Online (Sandbox Code Playgroud)
预处理指令.
使用模板类和专业化
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;
Run Code Online (Sandbox Code Playgroud)