Well I finally decided my choice on the set of Copro template. template<T>class Copro {};
And so :
using VMUnprotected = VM<uint8_t *>;
using VMProtected = VM<MemoryProtected>;
using CoproUnprotected = Copro<uint8_t *>;
using CoproProtected = Copro<MemoryProtected>;
It may not be the most beautiful syntactically solution, but it is relatively high-performance and without hacks.