我正在尝试使用默认实现和一些特殊化创建一个函数模板,如下所示:
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)
时,编译器使用默认实现(简单类型的实现)。
我做错了什么?
答案 0 :(得分:4)
从您的评论中,您似乎想要一个适用于sch_rec
和Vec2
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
中找到一个可能的实现