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

时间:2015-03-21 07:20:42

标签: c++ unions default-arguments

正如您在下面的代码中看到的,我尝试使用函数“initialize”的一些默认参数作为union。如何在C ++ 11之前更改函数“initialize”的定义以使其与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;
    }
}

1 个答案:

答案 0 :(得分:1)

实际上,扩展的初始化列表在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 demowith a compiler拒绝了您的初始代码。

其他评论:

有一件事让我感到困惑:在你的联盟中,你将指针与一位标志结合起来。

这本身并不是在喋喋不休:它可以想象它是一种避免指针分配开销的技巧,有时候poitned的值足够小,可以直接存储在树中。

但是在这种情况下,不清楚你将如何知道它是活动成员(即何时使用指针,以及何时使用该标志)。

所以我建议你仔细检查一下这里没有错误/遗忘元素。