Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板默认参数作为指向自身的指针_C++_Templates_Parameter Passing_Default - Fatal编程技术网

C++ 模板默认参数作为指向自身的指针

C++ 模板默认参数作为指向自身的指针,c++,templates,parameter-passing,default,C++,Templates,Parameter Passing,Default,我试图开发一个通用的树模板类,基本上表示相同节点的层次结构。它有两个模板参数,第一个是数据,第二个是引用另一个节点(prev、next、parent、child)的类型。默认情况下,我希望它是指向节点的常规指针,但出于我的目的,我还需要它是不同的东西(例如,内存池中的整数索引)。下面的代码无法编译。本能地,我觉得这是可以做到的,但我不知道怎么做。有人能对此提供一个见解吗 template <typename U, typename TPTR = TreeNode_t<U>*&g

我试图开发一个通用的树模板类,基本上表示相同节点的层次结构。它有两个模板参数,第一个是数据,第二个是引用另一个节点(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; }
    ...
模板
TreeNode_t类
{
公众:
TPTR-prev;
TPTR下一步;
TPTR父母;
TPTR儿童;
乌姆;
公众:
TreeNode_t():上一个(0),下一个(0),父(0){}
~TreeNode_t(){}
U&data(){return m;}
常量U&data()常量{return m;}
...
具体来说,我通常会这样实例化它:

TreeNode_t<double> tree1;
TreeNode\u t tree1;
但是,有时我希望这样:

TreeNode_t<double, unsigned> tree2;
TreeNode\u t tree2;

提供一个特殊的默认值作为
void
,并在类内使用type:

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;
// ...
};
模板
TreeNode_t类
{
使用NodeType=std::conditional\u t;
公众:
节点类型prev;
下一个节点类型;
节点型亲本;
结节型儿童;
乌姆;
// ...
};

提供一个特殊的默认值作为
void
,并在类内使用type:

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;
// ...
};
模板
TreeNode_t类
{
使用NodeType=std::conditional\u t;
公众:
节点类型prev;
下一个节点类型;
节点型亲本;
结节型儿童;
乌姆;
// ...
};

您不需要两个类型参数,因为指针可以从基类型推断出来。当然,TreeNode在模板之前没有定义,因此它不会编译

template <typename U>
    class TreeNode_t
    {
    public:
        TreeNode_t<U>*    prev;
        TreeNode_t<U>*    next;
        TreeNode_t<U>*    parent;
        TreeNode_t<U>*    children;
    //...
模板
TreeNode_t类
{
公众:
TreeNode_t*prev;
TreeNode_t*下一步;
TreeNode_t*父母;
TreeNode_t*儿童;
//...

您不需要两个类型参数,因为指针可以从基类型推断出来。当然,TreeNode在模板之前没有定义,因此它不会编译

template <typename U>
    class TreeNode_t
    {
    public:
        TreeNode_t<U>*    prev;
        TreeNode_t<U>*    next;
        TreeNode_t<U>*    parent;
        TreeNode_t<U>*    children;
    //...
模板
TreeNode_t类
{
公众:
TreeNode_t*prev;
TreeNode_t*下一步;
TreeNode_t*父母;
TreeNode_t*儿童;
//...

它将是
TreeNode\u t
…它将是
TreeNode\u t
…不,正如我所说,指向节点的“指针”可能根本不是指针。不,正如我所说,指向节点的“指针”可能根本不是指针。看起来是完全有效的解决方案。谢谢。看起来是完全有效的解决方案。谢谢。