测试类型是否为分配器的正确方法是什么?
what is the correct way to test if a type is an allocator?
在 SFINAE 上下文中编写 allocator_traits<T>::value_type
似乎是一种测试类型 T
是否实际上是分配器的可行方法。然而,这并不是特别优雅,过去我曾被边角案例所困扰。
因此我的问题是:如果 T 是分配器而 ::false 则如何最好地实现包含 ::value
true 的 is_allocator<T>
特征?
Writing allocator_traits<T>::value_type
in a SFINAE context seems like a workable way to test if a type T
is, in fact, an allocator.
我认为这还不够。这只会检查 T
是否有 value_type
并且是否可重新绑定。 libstdc++ 和 libc++ 都会将 std::map<int, int>
视为该模型中的分配器。
该标准对 Allocator
的构成有 a table of requirements。我认为您最好的选择是检查几个表达式的有效性,即:
X::value_type
a.allocate(n)
有效并返回 X::pointer
a.deallocate(p, n)
有效
(其中 X
是您要检查的类型,a
是 X&
,n
是类型 allocator_traits<X>::size_type
的值)
如果有一种类型可以勾选所有这些框,但仍然不是全涂机,那么...¯\_(ツ)_/¯。
在 SFINAE 上下文中编写 allocator_traits<T>::value_type
似乎是一种测试类型 T
是否实际上是分配器的可行方法。然而,这并不是特别优雅,过去我曾被边角案例所困扰。
因此我的问题是:如果 T 是分配器而 ::false 则如何最好地实现包含 ::value
true 的 is_allocator<T>
特征?
Writing
allocator_traits<T>::value_type
in a SFINAE context seems like a workable way to test if a typeT
is, in fact, an allocator.
我认为这还不够。这只会检查 T
是否有 value_type
并且是否可重新绑定。 libstdc++ 和 libc++ 都会将 std::map<int, int>
视为该模型中的分配器。
该标准对 Allocator
的构成有 a table of requirements。我认为您最好的选择是检查几个表达式的有效性,即:
X::value_type
a.allocate(n)
有效并返回X::pointer
a.deallocate(p, n)
有效
(其中 X
是您要检查的类型,a
是 X&
,n
是类型 allocator_traits<X>::size_type
的值)
如果有一种类型可以勾选所有这些框,但仍然不是全涂机,那么...¯\_(ツ)_/¯。