c++ - 模板相关的类型定义

标签 c++ templates c++11

我正在修改模板化 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 中指定启发式的自由?类(class)?

最佳答案

您可以以不同的方式分解您的代码,并将与启发式无关的部分分开:

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;
    // ...
};

关于c++ - 模板相关的类型定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23309501/

相关文章:

c++ - 使用MPFR舍入到整数

c++ - 从其他类访问非类型模板参数的最佳方法是什么?

C++0x auto 无法推断出 vector<int> 成员函数指针的类型

c++ - 从 std::array 获取对原始数组的引用

c++ - 作为 Qt5 库的一部分进行编译时如何启用/禁用 WebKit 功能

c++ - 通过 FTP 上传文件的进度条 [C++]

c++ - double 的重载比较以允许数值错误

C++0x 模板函数对象推断

c++ - 模板偏特化

C++ 模板尖括号陷阱 - 什么是 C++11 修复?