I'm honestly not sure if I prefer this approach,

    #if CPP11
        class spin_mutex {
            ...new C++11 version for full class definition...
        };
    #else 
        class spin_mutex {
            ...old version for full class definition...
        };
    #endif 
        
or this one:

    class spin_mutex {
    ... some things same ...
    void lock () {
          blah
    #if CPP11
          foo    // one particular thing that is different
    #elif GCC
          bar
    #elif MSVC
          baz
    #endif
      }
    }

You did it the first way, and it's fine to stick to that.  I'm just warning you that when this gets approved and I merge it, I will probably look at it both ways to see which is clearer and more amenable to future debugging and editing, and may decide I like the other better.