Small fast pseudorandom number generator in C++
The SmallPrng(std::random_device &amp;rd) constructor seems like an utility method. It spares the client a single call to seed = rd(), but forces an inclusion of (otherwise unnecessary) &lt;random&gt;. IMHO, this constructor is absolutely unnecessary.
The purpose of the

        for(size_t i = 0; i &lt; 20; ++i)
            (*this)();


loop in the constructor is seems useless; it amounts to passing a different seed. In any case, use {} around the loop body.
An asymmetry between

        b = c + d;


in prng32() and

        b = c + rot&lt;N&gt;(d, 37);


in prng64() is striking. Needs a comment, at least.
As mentioned in comments, the static_assert(!(N != 32 &amp;&amp; N != 64), ....) is equivalent to static_assert((N == 32 || N == 64), ....) which is IMHO much cleaner.