No need to use a functor for `keywords`, free function template is enough (just as `x3::grammar`).
And I suggest to rename `keywords_directive` to `keywords_parser`, since `keywords_directive` is not a directive in any respect.

You'd better use `remove_reference` or `x3::unrefcv_t` if you take the args by universal-ref (i.e. `Keywords&&`), to avoid store references in tuple which may lead to life-time issue in some cases.