Вы можете просто добавить конструктор кусочную для типов? Если да, то вы можете создать ужасный макрос, который распаковывает и делегаты кортеж:
#define CONSTRUCT_FROM_TUPLE(CLS) \
template <class... Ts> \
CLS(std::tuple<Ts...> const& tup) \
: CLS(tup, std::index_sequence_for<Ts...>{}) \
{ } \
\
template <class Tuple, size_t... Is> \
CLS(Tuple const& tup, std::index_sequence<Is...>) \
: CLS(std::get<Is>(tup)...) \
{ }
и просто добавить их к типам:
struct A {
A(bool, int) { }
A(const A&) = delete;
CONSTRUCT_FROM_TUPLE(A)
};
struct B {
B(char, double) { }
B(const B&) = delete;
CONSTRUCT_FROM_TUPLE(B)
};
И пройти в кортежах:
std::tuple<A, B> tup(
std::forward_as_tuple(true, 42),
std::forward_as_tuple('x', 3.14));
Pre-C++ 11, я не знаю, что это возможно - у вас нет делегирования конструкторов вообще. Вы бы либо:
- Оставить свой
tuple
-как класса, который принимает кортежи в своем конструкторе
- Добавить кортежи конструкторов ваших типов, которые явно инициализировать то же самое, что и не-кортеж версия сделала
- есть кортеж типов, которые являются одним аргументом конструктивен, как
boost::tuple<boost::scoped_ptr<A>, boost::scoped_ptr<B>>(new A(...), new B(...))
(1) много работы, (2) являются дублирование кода и ошибки, и (3) включает в себя в настоящее время приходится делать выделение вдруг.
Для редактирования вы можете посмотреть [почему-есть-нет-кусочно-tuple-construction] (http://stackoverflow.com/questions/11846634/why-is-there-no-piecewise-tuple -конструкция) – Jarod42
Если вы можете сделать ваши типы подвижными, вы должны. Очень мало случаев, когда тип не должен быть подвижным. (В стандартной библиотеке атомы, мьютексы и переменные условия не могут быть перемещены по техническим причинам.) Если вы не можете сделать ваши типы подвижными, вы можете использовать 'std :: unique_ptr ' как обходной путь. – Brian
@Brian: move-constructor - это возможный вариант, который я бы предпочел избежать, чтобы, чтобы мой код был компилируемым на компиляторе, отличном от C++ 11. Спасибо за ответ в любом случае. – shrike