如何使用静态内部类成员的别名?

时间:2016-12-27 04:00:32

标签: c++ templates typedef using

如下面的代码,我想使用别名来避免内部类NIL的静态成员的繁琐写作。

//in RBTree.hpp
template <typename T, typename Comp>
class RBTree{
public:
    struct TreeNode{
       ...
       static TreeNode* NIL = new TreeNode();
       ...
    }
}

//in RBTree_IMPL.hpp
template <typename T, typename Comp>
using NIL = ???

我想使用关键字'using'来避免繁琐的写作,例如:

//in BST.hpp
template <typename T, typename Comp>
class BST{
public:
    struct TreeNode{
        ...
    }
}

//in BST_IMPL.hpp
template <typename T, typename Comp>
using TreeNode = typename BST<T, Comp>::TreeNode;

如上所述,它会很简单。所以我想找到一种如上所述使用静态内部成员的方法。 THX!

1 个答案:

答案 0 :(得分:1)

using用于为类型创建别名。您想为变量创建别名,在c ++中是引用。感谢c ++ 14的模板变量,以下内容应该有效:

//in RBTree_IMPL.hpp
template <typename T, typename Comp>
auto& NIL = RBTree<T,Comp>::TreeNode::NIL;

顺便说一下:我不认为NIL的课堂初始化会像你在你的例子中所展示的那样工作,因为它不是一个constexpr。您可能必须在类之外定义和初始化它。

修改

如果您遇到c ++ 11编译器,那么您可以做的最好的事情就是使用一个返回指针引用的函数:

template <typename T, typename Comp>
auto NIL() -> typename RBTree<T,Comp>::TreeNode*& {
   return RBTree<T,Comp>::TreeNode::NIL;
} 

//usage e.g.:
NIL<int,std::less<int>()-> ...