如何将union作为函数参数传递而不先定义它?

时间:2013-05-11 06:36:05

标签: c++

是否可以在函数调用中定义union临时,而不是先前定义它然后在参数中传递它?

示例:

           union data_t{
            double delaySeconds;
            float scale;
            float rotation;

            };

           void someFunction(data_t){}

现在我想调用someFunction,使用联合的任何元素是合适的:

            someFunction(WHAT DO I PUT HERE);

例如,如果要传递给期望包含构造函数的类型的函数,则可以在函数调用中定义临时函数。但我已经尝试过多种方式与这个联盟没有运气。例如,假设我想传递分配给scale的浮点数:

          someFunction(data_t.scale(2.0));

1 个答案:

答案 0 :(得分:2)

您可以为union定义构造函数以初始化成员。但是,您需要一种机制来区分设置的字段。下面,我定义了一个帮助器enum,并扩展了您的data_t以允许继承和成员区分。

enum data_t_type { DelaySeconds, Scale, Rotation };

struct data_t {
    union {
        double delaySeconds;
        float scale;
        float rotation;
    };
    union {
        unsigned char flags;
        struct {
            unsigned char isDelaySeconds : 1;
            unsigned char isScale : 1;
            unsigned char isRotation : 1;
        };
    };
    data_t () : flags(0) {}
};

现在,初始化实际上是使用template完成的,data_t_type作为参数。

template <data_t_type> struct data_type {};

template <> struct data_type<DelaySeconds> : data_t {
    data_type (double x) { delaySeconds = x; isDelaySeconds = 1; }
};

template <> struct data_type<Scale> : data_t {
    data_type (float x) { scale = x; isScale = 1; }
};

template <> struct data_type<Rotation> : data_t {
    data_type (float x) { rotation = x; isRotation = 1; }
};

现在,您可以像这样调用您的函数:

someFunction(data_type<Scale>(2.0));

由于data_type<>data_tsomeFunction()获得了正确的类型。