C ++ Инициализировать унаследованные шаблоны базовых классов - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь передать произвольные параметры во время построения классам, унаследованным через пакеты параметров шаблона.Рассмотрим следующий пример:

struct Zero {
    Zero() {}
};

struct Two {
    Two(int, int) {}
};

template <class... Pack>
struct User : Pack... {
    template <class... Params>
    User(Params... p) : Pack(p)... {} // How to do this correctly?
};

auto test = User<Zero, Two>(1,2);

Если я сейчас попытаюсь создать объект типа User<Zero, Two> , как я могу передать Params в правильный конструктор?

Самый очевидный обходной путь - иметь конструктор кортежей, принимающий ровно один кортеж для каждого типа, который может принять User, но для этого требуется изменить Zero и Two, что очень сложно в моем случае использования.

Возможно ли это?Также возможны обходные пути.

1 Ответ

0 голосов
/ 11 сентября 2018

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

template <class... Tuples>
User(Tuples&&... t) : Pack(std::make_from_tuple<Pack>(std::forward<Tuples>(t)))... {}

Обратите внимание, что из-за гарантированного исключения копирования временные объекты типа Pack... не будут созданы.

Live on Coliru

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