Drobne uwagi:
#if __cplusplus < 201103L
MSVC15 i najpewniej też 13 implementuje wszystkie potrzebne dla tego projektu funkcjonalności C++11, ale z grzeczności nie chcą podbić tego makra do 201103L póki nie osiągną 100% zgodności. Z tym ifem projekt się nie skompiluje na VS.
this_pointer_type array = this->__this_pointer = new cell_type[30000] { };
...
delete[] array;
To powinno być raczej w konstruktorze/destruktorze, żeby user mógł sam zdecydować ile chce poświęcić miejsca. No i żeby w przypadku wyjątku klasa porządnie po sobie posprzątała. Edit: a najlepiej użyj std::vector.
"this->" jest praktycznie wszędzie niepotrzebne.
Nazwy zaczynające się od __ są zarezerwowane dla implementacji języka, nie powinno się więc ich używać. (Osobiście w ogóle bym nie oznaczał nazw pól prywatnych w żaden sposób, ale to kwestia gustu.) To samo z makrami.
typedef typename std::string::iterator __code_iterator;
MSVC wyrzuca tu błąd "typename cannot be used outside a template declaration". Wyrzucenie typename albo zamiana typedefa na using rozwiązuje problem. GCC i Clang nie mają problemu z tym kodem, ale nie mam pojęcia która strona ma rację.
istream_type& old = *this->__is;
Tutaj dereferencja wskaźnika nullptr jest nielegalna i skutkuje niezdefiniowanym zachowaniem. Niestety nie widzę by którakolwiek diagnostyka to wykrywała i jest to praktycznie niezauważalny bug. Przy okazji, po co w ogóle chcesz zwracać ten strumień? Ta klasa i tak nie jest jego właścicielem, więc gdyby kiedykolwiek była potrzeba, można zakładać że można go uzyskać od prawdziwego właściciela.
: __is(nullptr), __os(nullptr) { }
Użyj inicjalizacji pól, będzie mniej duplikacji kodu w konstruktorach:
istream_type* __is = nullptr;
ostream_type* __os = nullptr;
typedef std::istream istream_type;
To jest moim zdaniem przesada, ale jak chcesz.
interpreter.h też powinien się znajdować w folderze include/.
A, i nigdy nie widziałem by ktoś robił wcięcie kodu po #ifndef w nagłówkach.