标签:std ... SFINAE 方式 value 几种 template type cout
一、通过函数返回值实现
template<class T> typename std::enable_if<std::is_trivially_default_constructible<T>::value>::type construct(T*) { std::cout << "default constructing trivially default constructible T\n"; }
template<class T, class... Args> std::enable_if_t<std::is_constructible<T, Args&&...>::value> // Using helper type construct(T* p, Args&&... args) { std::cout << "constructing T with operation\n"; ::new(detail::voidify(p)) T(static_cast<Args&&>(args)...); }
template<class T> auto len (T const& t) -> decltype( (void)(t.size()), T::size_type() ) { return t.size(); }
二、通过函数参数实现
template<class T> void destroy( T*, typename std::enable_if< std::is_trivially_destructible<T>::value >::type* = 0 ){ std::cout << "destroying trivially destructible T\n"; }
三、通过模板非类型参数实现
template<class T, typename std::enable_if< !std::is_trivially_destructible<T>{} && (std::is_class<T>{} || std::is_union<T>{}), bool>::type = true> void destroy(T* t) { std::cout << "destroying non-trivially destructible T\n"; t->~T(); }
四、通过模板类型参数实现
template<class T, typename = std::enable_if_t<std::is_array<T>::value> > void destroy(T* t) // note: function signature is unmodified { for(std::size_t i = 0; i < std::extent<T>::value; ++i) { destroy((*t)[i]); } }
当有多个重载时,不推荐使用该方式,会在C++语义上出现冲突,宜使用方法三。
五、通过模板偏特化实现
template <typename T, typename = void> struct iterator_trait : std::iterator_traits<T> {}; template <typename T> struct iterator_trait<T, std::void_t<typename T::container_type>> : std::iterator_traits<typename T::container_type::iterator> {};
六、通过c++20的concept实现
template<typename STR> requires std::is_convertible_v<STR,std::string> Person(STR&& n) : name(std::forward<STR>(n)) { ... }
template<typename T> concept ConvertibleToString = std::is_convertible_v<T,std::string>; ... template<typename STR> requires ConvertibleToString<STR> Person(STR&& n) : name(std::forward<STR>(n)) { ... }
template<ConvertibleToString STR> Person(STR&& n) : name(std::forward<STR>(n)) { ... }
标签:std,...,SFINAE,方式,value,几种,template,type,cout 来源: https://www.cnblogs.com/koala999/p/15991873.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。