Есть ли способ избежать написания конструкторов для всех типов в классе std :: variable? - PullRequest
1 голос
/ 10 января 2020

У меня есть struct, например:

struct A
{
    int a;
    std::variant<int, float, char> b;

    A() = default;
};

Я хочу добавить конструктор, который будет инициализировать a и b. Кажется, мне придется написать конструктор для всех типов в b, таких как A::A(int a1, int b1), A::A(int a1, float b1) et c.

Есть ли способ избежать этого?

Ответы [ 2 ]

8 голосов
/ 10 января 2020

Вы можете создать шаблонный конструктор для своего класса и, в лучшем случае, применить совершенную пересылку, чтобы передать свой аргумент конструктору 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

Никаких ненужных ходов / копий / временных действий не будет.

2 голосов
/ 10 января 2020

Полагаю, что-то подобное также сработает, однако скопирует переданный вами вариант.

A::A(int a1, std::variant<int, float, char> b1)

Способность передавать только требуемый тип может быть преимущество. Однако я не рекомендовал бы использовать это решение другого ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...