模板中的预处理器条件

时间:2014-06-12 11:31:15

标签: c++ templates c-preprocessor

我目前正在为一个函数创建模板,如果模板在特定的类中,我需要一个不在函数内部使用代码的方法,我已经尝试了下面的内容,但我没想到它会工作,它是C ++,这太方便了:P是否其他人对如何实现这一点有任何建议?

template<typename T> int Position::lSetPosition(lua_State* L){
    #if T != Pro::Scene::Scene
        auto p = Util::luaP_touserdata<T>(L, 1);
        auto v = Math::Vector2(static_cast<int>(lua_tonumber(L, 2)),
            static_cast<int>(lua_tonumber(L, 3)));
        p->setPosition(v);
        return 0;
    #endif 
}

1 个答案:

答案 0 :(得分:3)

这是使用模板专业化的好地方。试试以下内容:

template<typename T> int Position::lSetPosition(lua_State* L) {
  auto p = Util::luaP_touserdata<T>(L, 1);
  auto v = Math::Vector2(static_cast<int>(lua_tonumber(L, 2)),
      static_cast<int>(lua_tonumber(L, 3)));
  p->setPosition(v);
  return 0;
}

template<> int Position::lSetPosition<Pro::Scene::Scene>(lua_State* L) {}

本质上,模板专门化允许您根据类型实现模板类或函数的不同实现,这正是您想要的。对于类型T执行某些操作,对于类型Pro::Scene::Scene执行其他操作。当编译器看到您在模板中指定的类型时,它将自动选择要使用的正确类型。