我正在尝试创建具有默认实现和某些专业化的功能模板,如下所示:

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中找到一种可能的实现。

关于c++ - 功能模板特化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40591029/

10-09 20:40