I don't know about a better way, although there might be one. However, just to point it out, you do not need to use select to get the first returned result; if you never specify which result you want, the first one is the default 100% of the time.
local name = GetSpellTabInfo(GetPrimaryTalentTree()+1)
Wasn't sure where to put it. :P I Plan on using the above code in a way that needs select...
function GetCurrentSpec( i )
local name = select( i ,GetSpellTabInfo(GetPrimaryTalentTree()+1) )
Since GetSpellTabInfo returns (name, texture, offset, numSpells), what the index would be used for ? And why not using an external select when need be ? E.G.
-- When you need the 4 parameters:
local name, texture, offset, numSpells = GetCurrentSpec()
-- When you need only the 3rd :
local offset = select(3, GetCurrentSpec())
local _, _, offset = GetCurrentSpec() -- alternative way to do so
By the way, if a any point in your code you need two or more return values or you are using them in a loop, you would better get them all once and put them in local variables.