如何将联合作为函数参数传递而不首先定义它

How to pass a union as a function parameter without defining it first?

本文关键字:定义 参数传递 函数      更新时间:2023-10-16

是否有可能在函数调用内部定义临时联合,而不是之前定义它,然后在参数中传递它?

的例子:

           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));

可以为联合定义一个构造函数来初始化成员。但是,您需要一种机制来区分设置了哪个字段。下面,我定义一个帮助器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_t,所以someFunction()得到了正确的类型