函数模板专门化

Function template specialization

本文关键字:专门化 函数模板      更新时间:2023-10-16

我正在尝试创建一个函数模板与默认实现和一些专门化如下:

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)时,编译器使用默认实现(简单类型的实现)。

我做错了什么?

从你的评论,似乎你想要一个版本应该工作与Vec2const 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);
}

注意:如果T是引用类型,行为是未定义的


以上代码使用了c++ 11中的std::remove_cv,在c++ 98中实现它并不难,您可以从std::remove_cv

中找到一种可能的实现