gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:14:06 32 4
gpt4 key购买 nike

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

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com