Стандартные шаблоны std::pair
и std::array
являются частными случаями std::tuple
, и само собой разумеется, что они должны иметь очень похожий набор возможностей.
Однако, единственный среди трех, std::pair
допускает кусочное построение . То есть, если типы T1
и T2
можно построить из набора аргументов a1, a2,...
и b1, b2,...
, то с моральной точки зрения мы можем составить пару
"pair<T1, T2> p(a1, a2,..., b1, b2,...)"
напрямую. Практически это прописано примерно так:
std::pair<T1, T2> p(std::piecewise_construct,
std::forward_as_tuple(a1, a2,...),
std::forward_as_tuple(b1, b2,...));
Вопрос:Почему для массивов и кортежей не существует одинаковой кусочной конструируемости? Есть ли глубокая причина, или это простое упущение? Например, было бы неплохо иметь:
std::tuple<T1, T2, T3> t(std::piecewise_construct,
std::forward_as_tuple(a1, a2,...),
std::forward_as_tuple(b1, b2,...),
std::forward_as_tuple(c1, c2,...));
Есть ли причина, по которой это невозможно сделать?[ Редактировать:Или я совсем неправильно понимаю цель кусочного построения?]
(У меня действительно есть ситуация, в которой я хотел бы инициализировать вектор кортежей со значением элемента по умолчанию, которое я бы предпочел построить непосредственно из аргументов, не указывая каждый тип элемента кортежа снова.)