SFINAE几种实现方式
2022/3/11 23:20:37
本文主要是介绍SFINAE几种实现方式,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
一、通过函数返回值实现
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)) { ... }
这篇关于SFINAE几种实现方式的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-27OpenFeign服务间调用学习入门
- 2024-12-27OpenFeign服务间调用学习入门
- 2024-12-27OpenFeign学习入门:轻松掌握微服务通信
- 2024-12-27OpenFeign学习入门:轻松掌握微服务间的HTTP请求
- 2024-12-27JDK17新特性学习入门:简洁教程带你轻松上手
- 2024-12-27JMeter传递token学习入门教程
- 2024-12-27JMeter压测学习入门指南
- 2024-12-27JWT单点登录学习入门指南
- 2024-12-27JWT单点登录原理学习入门
- 2024-12-27JWT单点登录原理学习入门