如何缩短模板类的typename语法

时间:2016-08-17 13:14:46

标签: c++ c++14

我有一个模板类,其定义如下:

template <class T>
class BinarySearchTree
{
private:
    struct Node
    {
        T m_value;
        Node* m_left;
        Node* m_right;

        Node(const T& value = T(), 
            Node* const left = nullptr,
            Node* const right = nullptr)
            : m_value(value)
            , m_left(left)
            , m_right(right)
        {

        }
    };

public:
    const Node* find(const T& value) const;
};


template <class T>
const typename BinarySearchTree<T>::Node* BinarySearchTree<T>::find(const T& value) const
{
 // some code here
}

因此,有许多函数返回Node*,并且每次在类外部编写函数返回类型的typename BinarySearchTree<T>::Node*都非常烦人。还有更好的方法吗?

3 个答案:

答案 0 :(得分:16)

使用尾随返回类型:

template <class T>
auto BinarySearchTree<T>::find(const T& value) const -> Node* 
{
 // some code here
}

使用类的范围评估BinarySearchTree<T>::find之后的所有内容。

这允许您将定义放在类之外,而不使用类型别名来缩短名称。

答案 1 :(得分:3)

您可以将模板别名引入:

template<typename T>
using Node = typename BinarySearchTree<T>::Node;


template <class T>
Node<T> const* BinarySearchTree<T>::find(const T& value) const
{
 // some code here
 return nullptr;
}

答案 2 :(得分:2)

“显而易见”的解决方案是将函数定义内联到类中,这并不总是一个好主意。

另一种可能是使用带模板的类型别名和using关键字(从C ++ 11开始支持):

template<typename T>
using Node = typename BinarySearchTree<T>::Node;

然后您可以使用(全局)类型别名Node,如

template <class T>
const Node<T>* BinarySearchTree<T>::find(const T& value) const
{
    // some code here
}