One problem with the iterator used in the static polymorphism article is the lack of abstraction. The storage container is a tuple and the caller is required to explicitly handle it: create it and pass it to the iterator.
This is not ideal because the iterator exposes internal implementation details and its public interface is coupled to those details. A change of the storage container would break the API and the caller would be required to make changes to their code.
Perhaps the tuple could be switched to an array that uses a variant
from boost or C++17 standard library. The implementation change should not impact the public API.
This can be achieved by designing an abstract API that does not expose the internal storage. I’m going to present a way of doing this by wrapping the old static iterator (I’ve changed it a little bit; the entire code is at the end of the article) with a new class that will be the public API.
The API accepts a list of types that you want to iterate over by variadic template arguments.
template <typename... Ts> class StaticIterator { static_assert(sizeof...(Ts) > 0, "at least one type is required"); };