我有一個通用函數,用於將內容推送到稱爲luaU_push的lua堆棧,該函數必須專用於任何想要使用它的類型。例如:具有模板參數的模板函數專門化
template <>
inline void luaU_push<>(lua_State* L, const Vector2i& val)
{
lua_newtable(L);
luaU_setfield<int>(L, -1, "x", val.x);
luaU_setfield<int>(L, -1, "y", val.y);
}
原來,Vector2i
實際上是一個typedef。真正的類型是Vector2<int>
。在其他一些地方,我使用Vector2f
s,這只是Vector2<float>
的一個typedef。
我希望能夠有一個luaU_push Vector2f
s。我可以爲Vector2f製作一個重複的函數,但我更願意將其作爲一個泛型,因此我可以在任何種類的Vector2<T>
上使用它,但我無法弄清楚這樣做的語法。我認爲我可以做這樣的事情,但這似乎不起作用:
template <>
template <typename T>
inline void luaU_push<>(lua_State* L, const sf::Vector2<T>& val)
{
lua_newtable(L);
luaU_setfield<T>(L, -1, "x", val.x);
luaU_setfield<T>(L, -1, "y", val.y);
}
有沒有辦法讓我的工作方式,我想要的?
編輯:
跟進的問題:我本來打算用這個問題的答案來解決一組功能,包括少數,只有返回類型不同,但我不認爲答案給定這就足夠了。例如,我有這個功能(這基本上是以上功能的對面)
template <>
inline sf::Vector2i luaU_to<>(lua_State* L, int index)
{
return sf::Vector2i(
luaU_getfield<int>(L, index, "x"),
luaU_getfield<int>(L, index, "y"));
}
我不相信有使用過載,使這項工作在一個通用的方式的方式,我可以」 t使用部分專業化。有什麼辦法可以讓它在這種情況下工作?
函數模板不能是部分專業。 [改用超載](http://www.gotw.ca/publications/mill17.htm)。 – 2012-02-27 07:15:07
n.m.是對的:你應該重載你的函數。但是,您是否也可以在專業化之前發佈您的原始通用'luaU_push'函數?我不明白你爲什麼需要這個通用模板函數,如果你需要專門爲evry類型的話... – Francesco 2012-02-27 07:43:39
@Francesco:[代碼在這裏](https://bitbucket.org/alexames/luawrapper/src /1a4b8ab1b737/LuaWrapperUtil.hpp)。也許我只能重載,但我確實喜歡模板專業化的對稱性。例如'lua_pushboolean'與'luaU_push'相同 - 並且清楚地表明您推送給Lua的類型是您期望的。 –
Alex
2012-02-27 07:55:37