Если ваш компилятор поддерживает C ++ 17, вы можете использовать if constexpr
:
template<typename T>
T LuaManager::GetGlobal(const std::string & name)
{
lua_getglobal(luaState, name);
T value;
if constexpr (std::is_same_v<T, std::string>)
value = lua_to_string(luaState, -1); // I don't know the actual name of this function
else if (std::is_same_v<T, int>)
value = lua_to_int(luaState, -1);
else if (std::is_same_v<T, whatever>)
value = lua_to_whatever(luaState, -1);
// some other arbitrary type dependent code
else ... // other types
lua_pop(luaState, 1);
return value;
}
Примечание. Чтобы включить C ++ 17 в Visual Studio, щелкните правой кнопкой мыши свой проект и выберите Свойства.Затем перейдите к C / C ++ -> Language -> C ++ Language Standard и выберите /std:c++17
или /std:c++latest
.
Update
Если вы не можете или не хотите использоватьC ++ 17, вот еще один подход, который не использует никаких «новых» функций, даже без шаблонов:
void get_lua_value(string& value)
{
value = lua_to_string(luaState, -1);
}
void get_lua_value(int& value)
{
value = lua_to_int(luaState, -1);
}
Добавьте одну из этих перегрузок для каждого типа.Тогда вы можете просто позвонить по номеру get_lua_value()
, и разрешение перегрузки выполнит эту работу за вас:
template<typename T>
T LuaManager::GetGlobal(const std::string& name)
{
lua_getglobal(luaState, name);
T value;
get_lua_value(value);
lua_pop(luaState, 1);
return value;
}