Simple packet parsing command pattern
The keyword explicit should be used with constructors taking a single argument in classes when automatic instantiation is not a universally valid operation (details and examples here).

The code review part


The packet_registry can just be an array of std::function (as you seem to be OK with paying for the virtual dispatch overhead) &mdash; std::array&lt;std::function&lt; packet const&amp;, ArgTypes...&gt;, 256&gt;
processor-s, given they are created just once, are better be created by value. Then you will be able to have a very hackable syntax &mdash; registry[x] = [...](auto&amp;&amp; packet, auto&amp;&amp; arg) { ... actual code ...};
if for some reason you do need shared pointers, prefer make_shared over direct usage of the new operator &mdash; x = std::make_shared&lt;type&gt;(args...).