simplify Stack
The code is simplified by
a) using a nested type StackDataValueType instead of repeated calls to typename std::remove_reference<StackDataType>::type, which btw should be abbreviated to std::remove_reference_t<StackDataType>.
b) removing the nested type StackType, which is unnecessary. The class name Stack acts like a full type name inside the templated Stack class. Therefore defining an alias StackType is not needed.