c++11函数模板“偏特化”的一种实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
c++11函数模板“偏特化”的⼀种实现
c++11模板的偏特化仅限于类模板,对于函数模板的偏特化,就需要借助std::enable_if类⾃动去编译enbale通过的函数。
问题描述:实现⼀个插值模板,把光滑阶数作为模板参数,实现1阶光滑的插值和2阶连续的插值。
template<typename type, unsigned int smoothness = 1>
typename enable_if<smoothness == 1, type>::type
interpolate(const type& a, const type& b, const type& x){
return x < a ? 0 : (x > b ? 1 : (x - a) / (b - a));
}
template<typename type, unsigned int smoothness>
typename enable_if<smoothness == 2, type>::type
interpolate(const type& a, const type& b, const type& x){
auto y = (x - a) / (b - a);
return y < 0 ? 0 : (y > 1 ? 1 : y * y * (static_cast<type>(3) - static_cast<type>(2) * y));
}
另⼀种应⽤是函数需要对整型和浮点型有不同的实现⽅式,也可以使⽤std::enable_if 和类型判别模板is_floating_point和is_integral实现。
template<typename type>
typename std::enable_if<std::is_floating_point<type>::value, void>::type
print(const type& value){
cout<<"floating:"<<value<<endl;
}
template<typename type>
typename std::enable_if<std::is_integral<type>::value, void>::type
print(const type& value){
cout<<"integral:"<<value<<endl;
}。