Ran some tests on the CountedPtr implementation. It works for types not including an inheritance diamond. I am trying to resolve this by reworking and simplifying the casting system. Also tested that all of the casting that can be is resolved at compile time, and included the results of some simple benchmarks below. The CountedPtr seems to be between 96% and 99.4% as fast as a raw pointer doing the same work.

Debug
1 - Creating and Dereferencing a raw pointer 10000000 times with external counting took: 349909 Microseconds
2 - Creating and Dereferencing a CountPtr 10000000 times with internal counting took: 593029 Microseconds
3 - Creating and Dereferencing a CountPtr 10000000 times with external counting took: 936663 Microseconds
4 - Creating and Dereferencing a shared_ptr 10000000 times with external counting took: 1216060 Microseconds
5 - Creating and Dereferencing a shared_ptr from make_shared10000000 times with external counting took: 2354075 Microseconds
6 - Creating, Dereferencing and Copying a raw pointer 10000000 times with external counting took: 370044 Microseconds
7 - Creating, Dereferencing and Copying a CountPtr 10000000 times with internal counting took: 776002 Microseconds
8 - Creating, Dereferencing and Copying a CountPtr 10000000 times with external counting took: 1090198 Microseconds
9 - Creating, Dereferencing and Copying a shared_ptr 10000000 times with internal counting took: 1559346 Microseconds
10 - Creating, Dereferencing and Copying a shared_ptr from make_shared 10000000 times with external counting took: 2730561 Microseconds

Release
1 - Creating and Dereferencing a raw pointer 10000000 times with external counting took: 329274 Microseconds
2 - Creating and Dereferencing a CountPtr 10000000 times with internal counting took: 342801 Microseconds
3 - Creating and Dereferencing a CountPtr 10000000 times with external counting took: 656759 Microseconds
4 - Creating and Dereferencing a shared_ptr 10000000 times with external counting took: 862029 Microseconds
5 - Creating and Dereferencing a shared_ptr from make_shared10000000 times with external counting took: 550947 Microseconds
6 - Creating, Dereferencing and Copying a raw pointer 10000000 times with external counting took: 327608 Microseconds
7 - Creating, Dereferencing and Copying a CountPtr 10000000 times with internal counting took: 336480 Microseconds
8 - Creating, Dereferencing and Copying a CountPtr 10000000 times with external counting took: 667205 Microseconds
9 - Creating, Dereferencing and Copying a shared_ptr 10000000 times with internal counting took: 1021065 Microseconds
10 - Creating, Dereferencing and Copying a shared_ptr from make_shared 10000000 times with external counting took: 731913 Microseconds