我有一个模板类,其定义如下:
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*
都非常烦人。还有更好的方法吗?
答案 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
}