用于识别 STL 容器的类型特征
在 C 中,类型特征可用于确定给定类型的属性。一个常见的需求是检查一个类型是否表示一个容器,例如向量、集合或映射。
向量的自定义实现
首先,让我们考虑专门为向量创建一个类型特征。但是,以下尝试无法编译:
<code class="cpp">template<class T, typename Enable = void> struct is_vector { static bool const value = false; }; template<class T, class U> struct is_vector<T, typename boost::enable_if<boost::is_same<T, std::vector<U>> >::type> { static bool const value = true; };</code>
此代码生成错误“部分特化中未使用模板参数:U”。这是因为在部分特化中未使用模板参数 U。
基于 SFINAE 的容器解决方案
更通用的方法是使用 Substitution Failure Is Not创建适用于各种 STL 容器的类型特征时出现错误 (SFINAE)。下面是一个示例:
<code class="cpp">template<typename T, typename _ = void> struct is_container : std::false_type {}; template<typename... Ts> struct is_container_helper {}; template<typename T> struct is_container< T, std::conditional_t< false, is_container_helper< typename T::value_type, typename T::size_type, typename T::iterator, typename T::const_iterator, decltype(std::declval<T>().size()), decltype(std::declval<T>().begin()), decltype(std::declval<T>().end()), decltype(std::declval<T>().cbegin()), decltype(std::declval<T>().cend()) >, void > > : public std::true_type {};</code>
此类型特征检查是否存在大多数 STL 容器常见的基本成员和方法。如果所有这些成员都存在,则 is_container
注意:为了确保类型特征仅标识 STL 容器,您可能需要调整检查以验证 STL 容器常见的特定要求。
以上是如何使用 SFINAE 创建类型特征来识别 C 中的 STL 容器?的详细内容。更多信息请关注PHP中文网其他相关文章!