我可以为联合的 C++ 函数设置默认参数吗
Can I set default arguments for C++ functions that are union
正如你在下面的代码中看到的,我试图让函数 "initialize" 的一些默认参数是并集。如何更改函数 "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 之前不可用。
只要牢记联合中只有一个成员在任何时候都可以处于活动状态,您可以使用默认构造函数轻松解决问题:
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 and here with a compiler 拒绝了您的初始代码。
补充说明:
有一件事让我感到困惑:在你的联盟中,你将一个指针与一个位标志组合在一起。
这本身并不令人震惊:它可以想象这是一种避免指针分配开销的技巧,有时指向的值小到足以直接存储在树中。
但是在这种情况下,不清楚您将如何知道哪个是活动成员(即何时使用指针,何时使用标志)。
所以我建议您交叉检查这里没有错误/遗忘元素。
正如你在下面的代码中看到的,我试图让函数 "initialize" 的一些默认参数是并集。如何更改函数 "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 之前不可用。
只要牢记联合中只有一个成员在任何时候都可以处于活动状态,您可以使用默认构造函数轻松解决问题:
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 and here with a compiler 拒绝了您的初始代码。
补充说明:
有一件事让我感到困惑:在你的联盟中,你将一个指针与一个位标志组合在一起。
这本身并不令人震惊:它可以想象这是一种避免指针分配开销的技巧,有时指向的值小到足以直接存储在树中。
但是在这种情况下,不清楚您将如何知道哪个是活动成员(即何时使用指针,何时使用标志)。
所以我建议您交叉检查这里没有错误/遗忘元素。