Можно ли каким-то умным образом инициализировать объединение как аргумент функции?

Я ищу немного синтаксического сахара, который, я не уверен, существует. Это сложно описать, поэтому я приведу пример:

#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

Но я надеюсь, что есть лучший способ. Есть?

0

Решение

Вы можете дать объединению несколько конструкторов:

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
}
8

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]