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

时间:2018-08-16 14:45:45

标签: c++ c++14 typetraits allocator

在SFINAE上下文中编写allocator_traits<T>::value_type似乎是一种测试类型T实际上是否为分配器的可行方法。但是,这并不是特别优雅,过去我一直被角落里的箱子烧死。

因此,我的问题是:在T是分配器而否则为:: false的情况下,如何最好地实现包含is_allocator<T>为true的::value特征?

1 个答案:

答案 0 :(得分:4)

  

在SFINAE上下文中写allocator_traits<T>::value_type似乎是测试类型T实际上是否是分配器的可行方法。

我认为这还不够。这只会检查T是否具有value_type并且可重新绑定。 libstdc ++和libc ++都将std::map<int, int>视为该模型中的分配器。

该标准包含Allocator的{​​{3}}。我认为您最好的选择就是检查几个表达式的有效性,即:

  • X::value_type
  • a.allocate(n)有效并返回X::pointer
  • a.deallocate(p, n)有效

(其中X是您要检查的类型,aX&,而n是类型allocator_traits<X>::size_type的值)

如果有一个检查所有这些框的类型仍然不是分配器,那么... \ _(ツ)_ /¯。