我正在尝试创建具有默认实现和某些专业化的功能模板,如下所示:
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
中找到一种可能的实现。关于c++ - 功能模板特化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40591029/