中找到一种可能的实现
我正在尝试创建一个函数模板与默认实现和一些专门化如下:
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)
时,编译器使用默认实现(简单类型的实现)。
我做错了什么?
从你的评论,似乎你想要一个版本应该工作与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);
}
注意:如果T
是引用类型,行为是未定义的
以上代码使用了c++ 11中的std::remove_cv
,在c++ 98中实现它并不难,您可以从std::remove_cv