首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用模板化参数的模板函数专门化

使用模板化参数的模板函数专门化
EN

Stack Overflow用户
提问于 2012-02-27 15:03:09
回答 2查看 181关注 0票数 0

我有一个名为luaU_push的通用函数,用于将内容推送到lua堆栈上,它必须专用于任何想要使用它的类型。例如:

代码语言:javascript
复制
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>上使用它,但是我不能弄清楚这样做的语法。我认为我可以做这样的事情,但这似乎不起作用:

代码语言:javascript
复制
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);
}

有没有办法让它按照我想要的方式工作?

编辑:

后续问题:我本来打算用这个问题的答案来修复一组函数,包括一些只在返回类型上不同的函数,但我认为给出的答案还不足以解决这个问题。例如,我有这个函数(基本上与上面的函数相反)

代码语言:javascript
复制
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"));
}

我不相信有一种方法可以使用重载来以通用的方式工作,我也不能使用部分专门化。在这种情况下,有什么方法可以让它工作吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-27 15:39:39

请将此答案作为评论。

代码语言:javascript
复制
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“!这是不允许的,也是可能的(除非你使用了一些不能理解的/不整洁的肮脏把戏)

你可以做的是,为每个返回的数据类型创建一个专门的版本,不要让编译器去做参数推导,也就是在模板调用中显式地提到数据类型。

票数 2
EN

Stack Overflow用户

发布于 2012-02-27 18:13:42

后续问题的

正如ArunMu上面提到的,只在返回类型上重载函数或专门化模板是非法的。

相反,您可以这样做:

代码语言:javascript
复制
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)
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9461180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档