C++ PATCH: PR 20599 (variadic templates, take two) (1/4)

Jason Merrill jason@redhat.com
Wed Oct 11 21:12:00 GMT 2006


Doug Gregor wrote:
> PACK_UNPACK_*'s can actually be used to "pack" arguments during
> template argument deduction. For instance, with tuple and its partial
> specialization:
> 
>  template<typename... Args> struct tuple;
> 
>  template<typename Head, typename... Tail>
>    struct tuple<Head, Tail...> { };
> 
> When we're doing template argument deduction for "tuple<int, float,
> double>", we essentially "pack" float and double into the template
> parameter pack "Tail". But, when we're expanding that type
> "tuple<Head, Tail...>" given bindings for Head and Tail, we're
> unpacking "Tail". At parse time we don't know whether we'll be using
> the expression to pack (template argument deduction), unpack
> (instantiation), or both. Even if we did know, the same
> CLASSTYPE_TI_ARGS for tuple<Head, Tail...> will be used for both
> template argument deduction and later instantiation.

Right.  Perhaps thinking about packing and unpacking with that tree code 
is the wrong level of granularity.  The PACK_UNPACK_* code just deals 
with the substitution, creating a new pack based on the argument packs. 
  It's the context in which it's used that actually does the unpacking, 
right? "Tail..." just represents a pack.

>> Also, the definition seem to allow for using multiple packs in a single
>> expansion, but the proposal doesn't cover that.
> 
> It's in the proposal, but it's not stressed enough. The examples with
> rvalue references (section 2.4, bottom of page 5) show expansion with
> multiple parameter packs ("Args" is a template type parameter pack,
> "args" is a function parameter pack).

Ah, I see.  And if that happens we assume that all the packs have the 
same number of elements?

Jason



More information about the Gcc-patches mailing list