大佬教程收集整理的这篇文章主要介绍了模板功能专业化C [复制],大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
有我的代码:
#include <iostream> #include <vector> template<typename T,int Size> T scalar_product(const std::vector<T> &a,const std::vector<T> &b) { return a[Size - 1]*b[Size - 1] + (scalar_product<T,Size - 1>(a,b)); } template<typename T> T scalar_product<T,0>(const std::vector<T> &a,const std::vector<T> &b) // error! { return a[0] * b[0]; } int main() { std::vector<int> a(3,1); std::vector<int> b(3,3); std::cout << scalar_product<int,3>(a,b); return 0; }
如果我使用此专业化T scalar_product< T,0>(…),我会收到错误“’scalar_product’:非法使用显式模板参数”.但是,如果我像这样删除T scalar_product(…)编译器报告递归将是无限的(因为没有专业化,据我所知).
template<typename T,int Size> struct MyFunctor { T scalar_product(const std::vector<T> &a,const std::vector<T> &b) { static_assert(Size > 0,"Size must be positive!") return a[Size - 1]*b[Size - 1] + (MyFunctor<typename T,Size - 1>::scalar_product(a,b)); } }; template<typename T> struct MyFunctor<T,1> { T scalar_product(const std::vector<T> &a,const std::vector<T> &b) { return a[0] * b[0]; } };
或者您可以使用std::enable_if实现部分功能专业化.
template<typename T,int Size> typename std::enable_if<(Size>1),T>::type scalar_product(const std::vector<T> &a,b)); } template<typename T,const std::vector<T> &b,typename std::enable_if<(Size == 1),void*>::type x = nullptr) { return a[0] * b[0]; }
请注意,我在2个函数中使用了两种不同的方法来使用std :: enable_if,以表明两者都是可能的.两个函数都可以像第一个函数一样在返回类型上使用enable_if,并且它们都可以像第二个函数那样在参数上使用它们.如需更多阅读,请参阅SFINAE.
template<typename T,const std::vector<T> &b) { static_assert(Size > 0,"Size must be positive!") if (Size==1) return a[0] * b[0]; return a[Size - 1]*b[Size - 1] + (scalar_product<T,(Size==1) ? Size : Size - 1>(a,b)); }
以上是大佬教程为你收集整理的模板功能专业化C [复制]全部内容,希望文章能够帮你解决模板功能专业化C [复制]所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。