依赖于模板的typedefs

Template dependent typedefs

本文关键字:typedefs 依赖于      更新时间:2023-10-16

我正在修改一个模板化的a*搜索,现在有了以下类(的一部分):

template <typename TNode, typename THeuristic>
class AStar
{
public:
    //  Typedefs.
    typedef d_ary_heap<TNode*, boost::heap::compare<NodeCompare<TNode>>, boost::heap::arity<4>, boost::heap::mutable_<true>> PriorityQueueType;
    //...
}

到目前为止,我还没有想过将启发式参数模板化,所以Node类定义如下:

template <typename T = float>
class Node
{
public:
    //  Typedefs:
    typedef typename AStar<Node>::PriorityQueueType::handle_type HeapHandle;
    //...
}

但现在,由于AStar采用了第二个模板参数进行启发式,typedef在这里给出了一个编译错误:typedef typename AStar<Node ??>...。在保持在AStar类中指定启发式的自由的同时,是否有可能以某种方式使其发挥作用?

您可以以不同的方式考虑代码,并将启发式独立部分分开:

namespace  detail
{
    template <typename T>
    struct AStarHeap
    {
        using QueueType = /* ... */;
        using HandleType = QueueType::handle_type;
        // ...
    };
}
template <typename Node, typename Heur>
struct AStar : detail::AStarHeap<Node>
{
    // ...
};
template <typename T>
struct Node
{
    using HeapHandle = typename detail::AStarHeap<T>::HandleType;
    // ...
};

根据我对这个问题的评论,我可能会这样做:

template <typename TNode, typename THeuristic = void>
class AStar;
template <typename TNode>
class AStar<TNode>
{
  // put everything that does not depend on THeuristic here
};
template <typename TNode, typename THeuristic>
class AStar : public AStar<TNode>
{
  // put everything that does depend on THeuristic here
};

现在来看,这采用了与Kerrek SB的答案大致相同的方法,但其优点是,使用AStar<TNode>的现有代码可以继续编译,只要它不尝试执行任何需要THeuristic的操作。