C++ 函数模板专门化
我正在尝试创建一个带有默认实现和一些专门化的函数模板,如下所示:C++ 函数模板专门化,c++,templates,C++,Templates,我正在尝试创建一个带有默认实现和一些专门化的函数模板,如下所示: 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 specializatio
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
然而,专业化并没有起作用。当我调用fromBool(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);
}
模板
结构fromboul\u impl{
静态T fromBool(bool var){返回变量?T(1):T(0);}
};
模板
结构fromboul\u impl{
来自bool的静态Vec2(bool变量){
返回变量?Vec2(1,1):Vec2(0,0);
}
};
模板
内联T fromBool(bool变量){
返回fromBool_impl::fromBool(var);
}
int main(){
fromBool(真);
fromBool(真);
}
注意:如果
T
为引用类型,则行为未定义
上面的代码使用了C++11中的
std::remove_cv
,在C++98中实现它并不困难,您可以从注释中找到一个可能的实现,似乎您需要一个既可以使用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);
}
模板
结构fromboul\u impl{
静态T fromBool(bool var){返回变量?T(1):T(0);}
};
模板
结构fromboul\u impl{
来自bool的静态Vec2(bool变量){
返回变量?Vec2(1,1):Vec2(0,0);
}
};
模板
内联T fromBool(bool变量){
返回fromBool_impl::fromBool(var);
}
int main(){
fromBool(真);
fromBool(真);
}
注意:如果
T
为引用类型,则行为未定义
上面的代码使用C++11中的
std::remove_cv
,在C++98中实现它并不困难,据我所知,中有一个可能的实现是可行的@StoryTeller发现问题是我需要为const
类型定义它。对于重新定义const
的所有专业化,是否有解决方法?能否编辑您的问题以显示实际问题?@manattta请提供更多代码!总的来说,它是有效的,这是肯定的。你做错了什么很难说,因为你既没有提供所需的最低限度的例子,也没有提供它造成的问题。记住,“不起作用”是你的解释,这只是次要的。首先,你必须提供事实(你做了什么,你看到了什么,你期望什么)!据我所知,@StoryTeller发现问题是我需要为const
类型定义它。对于重新定义const
的所有专业化,是否有解决方法?能否编辑您的问题以显示实际问题?@manattta请提供更多代码!总的来说,它是有效的,这是肯定的。你做错了什么很难说,因为你既没有提供所需的最低限度的例子,也没有提供它造成的问题。记住,“不起作用”是你的解释,这只是次要的。首先,你必须提供事实(你做了什么,你看到了什么,你期望什么)!