def*_*def 0 c++ templates default parameter-passing
我正在尝试开发一个通用树模板类,基本上,表示相同节点的层次结构.它需要2个模板参数,第一个是数据,第二个是引用另一个节点的类型(prev,next,parent,child).默认情况下,我希望它是一个传统的节点指针,但为了我的目的,我还需要它是不同的东西(例如内存池的整数索引).下面的代码无法编译.本能地,我觉得可以做到,但我不知道怎么做.任何人都可以提供这方面的见解吗?
template <typename U, typename TPTR = TreeNode_t<U>*>
class TreeNode_t
{
public:
TPTR prev;
TPTR next;
TPTR parent;
TPTR children;
U m;
public:
TreeNode_t() : prev(0), next(0), parent(0){}
~TreeNode_t(){}
U &data() { return m; }
const U &data() const { return m; }
...
Run Code Online (Sandbox Code Playgroud)
具体来说,我通常会像这样实例化它:
TreeNode_t<double> tree1;
Run Code Online (Sandbox Code Playgroud)
但是,有时我会这样想:
TreeNode_t<double, unsigned> tree2;
Run Code Online (Sandbox Code Playgroud)
提供一个特殊的默认值,void并在类中使用类型:
template <typename U, typename TPTR = void>
class TreeNode_t
{
using NodeType = std::conditional_t<std::is_same<void, TPTR>::value, TreeNode_t*, TPTR>;
public:
NodeType prev;
NodeType next;
NodeType parent;
NodeType children;
U m;
// ...
};
Run Code Online (Sandbox Code Playgroud)