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