В этом случае необязательно указывать привязку: Element
уже разложим, как:
struct Element { int i, j; };
auto [i, j] = Element{2, 3}; // ok
Однако, если предположить, что Element
на самом деле более сложный и требует пользовательских привязок, тогда да - вам нужно будет его убрать. Тем не менее, не нужно , чтобы находиться в глобальном пространстве имен. Это может быть где-то еще:
namespace detail {
template <typename T> struct Element { ... };
}
template<typename T>
class Collection
{
public:
using Element = detail::Element<T>;
friend Element;
// ...
};
И в этот момент специализировать привязки просто. В & dagger; нет никакого способа, поскольку, как вы указываете, специализация на Collection<T>::Element
является не выводимым контекстом.
<час />
& dagger; Если не считать новой языковой функции, которая позволила бы вам включить структурированные привязки внутри самого тела класса. Для этого была такая бумага, P1096 , но она была отклонена при предъявлении. Что не означает, что новое предложение не может быть лучше.