“best” is not a universally agreed concept. For example, the solution when you have a handful of textures is very different from when you have 50000 textures. There are also considerations like available tools that make certain assumptions, personal preferences, etc.
Last but not least, “best” is hard to find in the sea of possible solutions. Looking for 1 solution that is optimal in every possible way is near impossible. So instead, go with a solution that works for you, until it ceases to work satisfactory for some reason. Then find a different solution.
As for your suggested solution, if it works for you, use it.
I would make one change though. Avoid the hardcoded numbers and dependencies between numbers. In your current solution, if the tank offset changes, you now have to remember to change the bullet offset as well. You will forget to do that at some point or you will change it incorrectly, and it may cost a lot of time to find that mistake. So instead, let the computer do the counting rather than you, ie
static enum {
TankTop,
TenkBottom,
Bullet,
NumberOfTextures // 1 more than your Last.
};
You didn't state the language you use, but most languages specify the number of elements that exist in an array, so your
static Texture GameTextures[TextureID::Last];
has then 2 entries (index 0 and index 1).
EDIT: “number of entries” (aka “length”) is always 1 more than the index of the last entry when you start counting from 0!