【问题标题】:Is it possible to use if statement outside a function (like main)?是否可以在函数外部使用 if 语句(如 main)?
【发布时间】:2016-07-22 22:24:26
【问题描述】:

我正在实现一个 BOOOS - 基本面向对象操作系统,现在我需要让我的程序的调度程序在 FCFS 和优先级之间进行选择。我有一个名为 Task 的类,我在其中创建了两个队列:std::queue 和一个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)

}

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

【问题讨论】:

  • 他们选择 FCFS 还是优先级的决定因素是什么?这些东西可以是一次性的,还是依赖的?
  • 理想的情况是只制作一种类型的调度器,确实如此,但在这种情况下,我需要为它们都工作。大学的东西!
  • 您有没有想过将它们包装在一个对象中,然后让该对象根据您对该选择的预测做出决定?
  • 只是一个评论:volatile 不应该用于线程,而只能用于信号处理程序。
  • 顺便说一句:std::priority_queue&lt;Task*&gt; 不会以您可能认为的方式对元素进行排序,它会根据不使用 @ 的 operator&lt; 的元素的内存地址值进行排序987654329@.

标签: c++ if-statement static queue


【解决方案1】:

不,这不能通过使用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;
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多