3

是否可以在函数调用中定义一个临时联合,而不是预先定义它然后将它传递给参数?

例子:

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

1 回答 1

2

您可以为您的联合定义一个构造函数来初始化成员。但是,您需要一种机制来区分设置了哪个字段。下面,我定义了一个 helper 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) {}
};

现在,初始化实际上是使用 a作为参数完成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));

因为 adata_type<>是 a data_tsomeFunction()所以得到正确的类型。

于 2013-05-11T07:26:44.173 回答