测试类型是否为分配器的正确方法是什么?

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 是您要检查的类型,aX&n 是类型 allocator_traits<X>::size_type 的值)

如果有一种类型可以勾选所有这些框,但仍然不是全涂机,那么...¯\_(ツ)_/¯。