c++ - 如何解析像 std::allocator_traits 这样的可选嵌套类型?

标签 c++ c++11

分配器可以选择嵌套类型,如 pointer , const_pointer .但是可以始终将这些接口(interface)与 std::allocator_traits<Allocator> 一起使用,如果这些类型在 Allocator 中不存在,它将提供这些类型的默认版本.

如何std::allocator_traits实现的?模板如何在不存在时选择嵌套类型的默认版本?

最佳答案

解决方法是引用类型T::pointer在不是有效类型时不会导致错误的情况下,它会导致模板参数推导失败。其一般形式称为 SFINAE,代表“替换失败不是错误”。有关其工作原理的解释,请参阅我的 SFINAE Functionality Is Not Arcane Esoterica演示文稿。

有多种技术,通常涉及重载函数模板,但我目前最喜欢的是使用 void_t选择类模板的部分特化的习惯用法:

template<typename T>
  using void_t = void;

template<typename T, typename = void>
  struct get_pointer
  {
    using type = typename T::value_type*;
  };

template<typename T>
  struct get_pointer<T, void_t<typename T::pointer>>
  {
    using type = typename T::pointer;
  };

现在给定一个分配器类型 A你可以使用 typename get_pointer<A>::type引用A::pointer如果存在,否则 A::value_type*

上面的代码有效是因为当A::pointer是部分特化匹配的有效类型,并且比主模板更特化,因此被使用。当A::pointer不是有效类型部分特化格式错误,因此使用主模板。

关于c++ - 如何解析像 std::allocator_traits 这样的可选嵌套类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27549857/

相关文章:

c++ - 外部 "C"和 "C++"版本的 qsort()/bsearch() 的重载解析

C++是否有任何简单的可嵌入到您的应用程序库中的文本文件版本控制和修订控制?

c++ - 为什么我不能在 C++ 中从单个字符构造 std::string?

c++ - ns3 buffer.h 断言失败

C++11。 Lambdas成员变量捕获,STL列表中的 "this"指针陷阱

c++ - 部署后,简单的C++ ofstream项目无法正常工作

c++ - grpc c++ 异步完成队列事件

c++ - C++11 是否允许 vector<const T>?

c++ - 如何为 std::unique_ptr 创建一个有效的 C++ 别名模板

c++ - 您如何重新分配(也称为集合)unique_ptr 类成员?