Generic Property class
These are the things that stuck out to me:


Your copy constructor and move constructor don't result in an identical Property&lt;T1&gt; as they increment the id. Why is that? (There is no documentation anywhere in this that helps the consumer of your Property class.)
Your value constructor Property(T1 value) should probably initialize value with std::move(value). It has already received a copy (perhaps moved), so it is safe to move from value.
Your copy constructor uses what appears to be a superfluous static_cast&lt;T1&gt; and uses the constructor body instead of an initialization list. I would suggest this be more like the move constructor just without the call to std::move.
As nothing appears to change the value of id after it has been constructed, I don't see the benefit of id being atomic. I do understand the value of id_count being atomic, but making them both atomic seems to be asking for unnecessary overhead. Related, perhaps the usage of id_count should be moved to a static function so that it cannot be subverted.

static PropertyID getNextId() {      // assumes PropertyID is non-atomic
    static AtomicPropertyID id = 0;  // and AtomicPropertyID is conditionally atomic
    return id++;
}

I don't quite understand how Property&lt;T1&gt; is expected to be used. Does it go in a collection of properties? Is it used to declare as members of another type? If the former, the implementation of operator&lt; doesn't seem to provide any useful characteristics for finding the right property. If the latter, the encapsulation seems to be a very long winded way of conditionally making a member atomic - since there is no business logic in the setter or getter methods, and no way to provide that other than inheriting, I'm unclear what the benefit is of using this class.