Вы можете создать шаблонный конструктор для своего класса и, в лучшем случае, применить совершенную пересылку, чтобы передать свой аргумент конструктору variant
member:
template <typename T>
A::A(int i, T&& t) : a(i), b(std::forward<T>(t)) { }
Затем вы можете написать, например, :
A obj1(1, -7.4f); // float variant member
A obj2(2, 7); // int variant member
A obj3(3, 'c'); // char variant member
Никаких ненужных ходов / копий / временных действий не будет.