gpt4 book ai didi

c++ - 我可以为 union 的 C++ 函数设置默认参数吗

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:16:56 24 4
gpt4 key购买 nike

正如您在下面的代码中所看到的,我试图让函数“initialize”的一些默认参数是并集。如何更改函数“初始化”的定义以使其与C++ 11之前的C++兼容?我需要向 RedBlackPointer 添加一些构造函数吗?如果是,怎么办?

template <typename T> class RedBlackNode{
protected:
union RedBlackPointer{
RedBlackNode *node;
struct{
unsigned value:1; // for color / other info
}flag;
}left, right, parent;

T key;

public:
void initialize(T key, RedBlackPointer left = {(RedBlackNode*)0},
RedBlackPointer right = {(RedBlackNode*)0},
RedBlackPointer parent = {(RedBlackNode*)0}){
this->key = key;
this->left = left; this->right = right;
this->parent = parent;
}
}

最佳答案

的确,扩展初始化列表在 C++11 之前是不可用的。

只要记住 union 中只有一个成员在任何时候都可以处于事件状态,就可以使用默认构造函数轻松解决问题:

template <typename T> class RedBlackNode{
protected:
union RedBlackPointer{
RedBlackPointer() : node(0) { } // <==== default constructor
RedBlackNode *node;
struct{
unsigned value:1; // for color / other info
}flag;
}left, right, parent;
T key;
public:
void initialize(T key, RedBlackPointer left = RedBlackPointer(), //refer to default ctor
RedBlackPointer right = RedBlackPointer(),
RedBlackPointer parent = RedBlackPointer()){
this->key = key;
this->left = left; this->right = right;
this->parent = parent;
}
void show() {
cout<<left.node<<","<<right.node<<","<<parent.node<<","<<key<<endl;
}
}; // <=== ;

这里是如何证明它有效的:

 RedBlackNode<int> N; 
N.initialize(5);
N.show();

这里是live demo在这里 with a compiler拒绝了您的初始代码。

补充说明:

有一件事让我感到困惑:在你的联盟中,你结合了一个指针和一个位标志。

这本身并不令人震惊:它可以想象这是一种避免指针分配开销的技巧,有时指向的值小到足以直接存储在树中。

但是在这种情况下,不清楚您将如何知道哪个是事件成员(即何时使用指针,何时使用标志)。

所以我建议你交叉检查这里没有错误/遗忘元素。

关于c++ - 我可以为 union 的 C++ 函数设置默认参数吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29180262/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com