分配器可以选择嵌套类型,如 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/