I think this would work better if we shifted the model to be like HitSet:

 Params has an impl pointer, and all the decode/encode bits that currently live in Decoder
 HitSet*::Params are children of Params::Impl

That way pg_pool_t has a HitSet::Params member and not a ::Decoder.  And I think the unusual accessors in Decoder can go away...