我有一个名为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实际上是一个类型定义函数。真正的类型是Vector2<int>。在其他一些地方,我使用的是typedef s,它只是Vector2<float>的一个Vector2f。
我希望能有一个用于Vector2fs的luaU_push,我可以为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"));
}我不相信有一种方法可以使用重载来以通用的方式工作,我也不能使用部分专门化。在这种情况下,有什么方法可以让它工作吗?
发布于 2012-02-27 15:39:39
请将此答案作为评论。
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);
}这应该是可行的。在模板化函数的情况下,“基本模板”函数总是比完全专门化的函数具有更高的优先级。
编辑::
您已经根据返回类型重载了函数"luaU_to“!这是不允许的,也是可能的(除非你使用了一些不能理解的/不整洁的肮脏把戏)
你可以做的是,为每个返回的数据类型创建一个专门的版本,不要让编译器去做参数推导,也就是在模板调用中显式地提到数据类型。
发布于 2012-02-27 18:13:42
后续问题的:
正如ArunMu上面提到的,只在返回类型上重载函数或专门化模板是非法的。
相反,您可以这样做:
class LuaCheck {
public:
LuaCheck (lua_State* L, int index)
: L_(L), index_ (index)
{ }
operator int () { return luaL_checkinteger(L_, index_); } // (a)
operator double () { return luaL_checknumber(L_, index_); } // (b)
private:
lua_State* L_;
int index_;
};
int main () {
lua_State * L = ...;
int index = ...;
int a = LuaCheck (L, index); // will call (a)
double b = LuaCheck (L, index); // will call (b)
}https://stackoverflow.com/questions/9461180
复制相似问题