函数模板专门化
Function template specialization
我正在尝试创建一个函数模板与默认实现和一些专门化如下:
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
相关文章:
- 如何在编译时专门化大型模板函数中的小部分
- 错误 C2893 无法专门化函数模板'unknown-type std::invoke(_Callable &&,_Types &&...)'
- 从 std 命名空间中专门化函数模板的想法有多糟糕?
- 如何专门化模板构造函数模板
- 专门化采用通用引用参数的函数模板
- 使用decltype尾部返回类型专门化函数模板
- 为模板化派生类专门化函数模板
- 如何专门化容器的函数模板
- 为模板函数专门化一个模板类
- 显式函数模板专门化选择了错误的专门化
- 如何部分专门化可变模板函数
- C++模板-专门化函数
- 在单独的.cpp文件中专门化函数模板
- 如何专门化具有多个参数的函数模板
- 如何专门化此模板成员函数
- 函数模板的显式专门化,用于完全专门化的类模板
- 函数模板专门化
- 二进制搜索的一个函数模板专门化
- 创建专门化函数模板的最佳方法是什么?
- c++中专门化函数模板的语法