功能模板专业化

时间:2016-11-14 14:26:31

标签: c++ templates

我正在尝试使用默认实现和一些特殊化创建一个函数模板,如下所示:

template <typename T>
inline T fromBool(bool var) { return var ? T(1) : T(0); }

template <>
inline Vec2 fromBool<Vec2>(bool var) { return var ? Vec2(1, 1) : Vec2(0, 0); }

// Some more specializations for Vec3, etc

这是复杂类型Vec2的示例定义:

struct Vec2 {
  double x, y;
  Vec2(double a, double b) { x = a; y = b; }
}

但是,专业化不起作用。当我调用fromBool<const Vec2>(var)时,编译器使用默认实现(简单类型的实现)。

我做错了什么?

1 个答案:

答案 0 :(得分:4)

从您的评论中,您似乎想要一个适用于sch_recVec2

的版本
const Vec2

注意:如果template <typename T> struct fromBool_impl { static T fromBool(bool var) { return var ? T(1) : T(0); } }; template <> struct fromBool_impl<Vec2> { static Vec2 fromBool(bool var) { return var ? Vec2(1, 1) : Vec2(0, 0); } }; template <typename T> inline T fromBool(bool var) { return fromBool_impl<typename std::remove_cv<T>::type>::fromBool(var); } int main() { fromBool<Vec2>(true); fromBool<const Vec2>(true); } 是引用类型,则行为未定义。

以上代码使用C ++ 11中的T,在C ++ 98中实现它并不困难,你可以从std::remove_cv中找到一个可能的实现