可以缩短std :: priority_queue声明而不需要专门化吗?

时间:2016-10-01 03:40:01

标签: c++ std priority-queue

我希望并且认为这个问题不是C++ template typedef的重复,所以这里是:

我想知道社区是否可以帮助我了解是否可以通过template<typename ORDER> std::priority_queue<int, std::vector<int>, ORDER> 缩短typedef而无需专业化。我想为这个答案打折#define。我不确定C ++ 11的alias功能是否适用于此,但我还需要将其用作答案,因为我正在使用的编译器是C ++ 03

上下文是一些示例代码:

#include <iostream>
#include <queue>

namespace
{

template<typename ORDER>
std::priority_queue<int, std::vector<int>, ORDER> GetPriorityQ(std::vector<int> numbers)
{
    std::priority_queue<int, std::vector<int>, ORDER> theQueue;

    for (int i = 0; i < numbers.size(); ++i)
    {
        theQueue.push(numbers[i]);
    }

    return theQueue;
};

class Less
{
public:
    operator()(int a, int b)
    {
        return (a < b);
    }
};

class More
{
public:
    operator()(int a, int b)
    {
        return (b < a);
    }
};

}

int main(int argc, char* argv[])
{
    std::vector<int> v({4, 9, 2, 8});

    std::priority_queue<int, std::vector<int>, Less> pqLess = 
        GetPriorityQ<Less>(v);

    std::cout << "Ordered by Less:" << std::endl;
    while (!pqLess.empty())
    {
        std::cout << pqLess.top() << std::endl;
        pqLess.pop();
    }

    std::priority_queue<int, std::vector<int>, More> pqMore = 
        GetPriorityQ<More>(v);

    std::cout << "Ordered by More:" << std::endl;
    while (!pqMore.empty())
    {
        std::cout << pqMore.top() << std::endl;
        pqMore.pop();
    }

    return 0;
}

我知道我可以用......之类的东西来缩短优先级队列的专业化

typedef std::priority_queue<int, std::vector<int>, Less> LessQueue;

...但我想知道是否有一种方法可以缩短而不用专业化,这样我就可以保持GetPriorityQ(...)通用(即如果我是专门的) priority_queue的typedef,我必须实现GetPriorityQ(...)我希望避免的许多专业化。

即,在伪代码中,有办法做类似的事情:

typedef std::priority_queue<int, std::vector<int>, ORDER> OrderedQ

...

template<typename ORDER>
OrderedQueue<ORDER> GetPriority(std::vector<int> numbers)
{
   ...
}

...

int main(int argc, char* argv[])
{
    ...
    OrderedQueue<Less> pqLess = GetPriorityQ<Less>(v);
    ...
}

我要问的是,即使在这个简化的例子中,定义priority_queue的行的长度也会很长。我正在处理的实际代码(此示例是一个简化版本)更长,因此难以阅读。

答案本身并不一定需要typedef。任何与C ++ 03兼容且不使用#define的东西都可以。

谢谢。

1 个答案:

答案 0 :(得分:2)

对于C ++ 03,你不能避免一些措辞,即(在模板代码中)typename,但除此之外:

template< class Order >
struct Pq
{
    typedef std::priority_queue<int, std::vector<int>, Order> T;
};

所以现在你可以写例如Pq<OrderA>::T,更短。或者,当OrderA是模板参数时,typename Pq<OrderA>::T

免责声明:编译器未触及的代码。

在其他新闻中:

  • ALL UPPERCASE是一个眼睛,除了宏名称与宏命名的常见惯例冲突外,还用它来做任何事情。