Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 函数模板专门化_C++_Templates - Fatal编程技术网

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请提供更多代码!总的来说,它是有效的,这是肯定的。你做错了什么很难说,因为你既没有提供所需的最低限度的例子,也没有提供它造成的问题。记住,“不起作用”是你的解释,这只是次要的。首先,你必须提供事实(你做了什么,你看到了什么,你期望什么)!