gpt4 book ai didi

c++ - 函数模板特化

转载 作者:行者123 更新时间:2023-11-27 22:48:25 25 4
gpt4 key购买 nike

我正在尝试创建一个具有默认实现和一些特化的函数模板,如下所示:

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) ,编译器使用默认实现(用于简单类型的实现)。

我做错了什么?

最佳答案

从你的评论来看,你似乎想要一个应该与 Vec2const 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com