是否可以在函数调用中定义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));
答案 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_t
,someFunction()
获得了正确的类型。