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

C++ 如何将联合作为函数参数传递,而不首先定义它?,c++,C++,是否可以在函数调用中定义一个临时联合,而不是以前定义它,然后在参数中传递它 例如: union data_t{ double delaySeconds; float scale; float rotation; }; void someFunction(data_t){} 现在我想调用someFunction,使用union中合适的任何元素:

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

例如:

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

            };

           void someFunction(data_t){}
现在我想调用
someFunction
,使用union中合适的任何元素:

            someFunction(WHAT DO I PUT HERE);
例如,如果要传递给一个函数,该函数需要一个包含构造函数的类型,则可以在函数调用中定义临时类型。但我试过各种方法来对付这对组合,但都没有成功。例如,假设我想传递一个分配给
scale
的浮点:

          someFunction(data_t.scale(2.0));

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

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> 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; }
};
模板结构数据类型{};
模板结构数据类型:数据{
数据类型(双x){delaySeconds=x;isDelaySeconds=1;}
};
模板结构数据类型:数据{
数据类型(浮点x){scale=x;isScale=1;}
};
模板结构数据类型:数据{
数据类型(浮点x){rotation=x;isRotation=1;}
};
现在,您可以这样调用函数:

someFunction(data_type<Scale>(2.0));
someFunction(数据类型(2.0));

由于
数据类型
数据类型
someFunction()
得到了正确的类型。

如果是我,我会像瘟疫一样避免
联合
。。。如果使用正确,联合会可能非常强大。为什么不使用重载?@Pubby更好的解决方案可能是为此使用模板。我只是想避免编写一堆重载函数,特别是当
data\u t
有超过几个这样的潜力时contents@Fellowshee当前位置在这一点上,我支持Pubby。一个可能需要秒、角度或比例因子的函数听起来像是一个设计问题——你需要在函数内部进行一些手动调度,而你不能用union来完成,因为没有办法知道哪个成员是初始化的。(而且模板似乎也不是正确的工具)。重载或只是为不同的操作使用不同的函数听起来更理智。有趣的是,这与我所做的相似,但是我在这里遇到了一个相关的问题:<代码> VEC3可能是你的问题。在C++编程参考中搜索BITFEAR或BIT字段。这个答案对我的问题来说是一个非常有趣的解决方案,谢谢。我已经搜索了一会儿,看看你的冒号语法在代码>未签名CHARISISLAYS秒:1;但是我不能。这是一种对字符的替代吗?