c++ - 模板中的预处理器条件

标签 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 
}

最佳答案

这是使用模板特化的好地方。尝试以下操作:

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 做一些其他事情。当编译器看到您在模板中指定的类型时,它会自动选择要使用的正确类型。

关于c++ - 模板中的预处理器条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24183289/

相关文章:

c++ - 请有人解释为什么这里含糊不清?

c++ - 如何使依赖于模板的 typedef 更方便?

c++ - vector::constructor 的模板参数

c++ - 将指针数组初始化为 NULL

C++人脸检测结合c#WPF

c++ - 字符串与十六进制值的用户定义文字

c - gcc 中已经定义了哪些 C 预处理器宏?

c++ - 当我有表面声明时,如何为 sm_1X 和 sm_2X 编译 CUDA 程序

C 宏包装

c++ - 当我可以返回一个指针时,为什么要使用 boost::optional