我可以用一些巧妙的方法将并集初始化为函数参数吗

Can I initialize a union as a function argument in some clever way?

本文关键字:初始化 函数 参数 方法 我可以      更新时间:2023-10-16

我正在寻找一点我不确定是否存在的语法糖。这很难描述,所以我将提供一个例子:

#include <iostream>
using namespace std; // haters gonna hate
union MyUnion
{
    float f;
    unsigned int i;
    // more types
};
unsigned int someFunction(MyUnion m)
{
    return m.i;
}
int main()
{
    unsigned int i = 10;
    float f = 10.0;
    // this is the syntactic sugar I'm looking to emulate
    cout << someFunction(i) << endl; // automagically initializes unsigned int member
    cout << someFunction(f) << endl; // automagically initializes float member
    return 0;
}

我知道我可以定义我的函数的一堆重载,在堆栈上声明并集,初始化它,比如:

unsigned int someFunction(unsigned int i)
{
    return i; // this is the shortcut case
}
unsigned int someFunction(float f)
{
    MyUnion m = {f};
    return m.i;
}
// more overloads for more types

但我希望有更好的方法。有吗?

您可以为并集提供一些构造函数:

union Jack
{
    int a;
    float f;
    Jack(int a_) : a(a_) { }
    Jack(float f_) : f(f_) { }
};
Jack pot(1);
Jack son(1.);
int main()
{
    someFunction(Jack(100));
    someFunction(100);        // same, implicit conversion
}