c++ 测试一个类型是否是分配器的正确方法是什么?

7eumitmz  于 2023-07-01  发布在  其他
关注(0)|答案(2)|浏览(87)

在SFINAE上下文中编写allocator_traits<T>::value_type似乎是测试T类型是否实际上是分配器的可行方法。然而,这并不是特别优雅,我过去也曾被角落的案例所灼伤。
所以我的问题是:如何最好地实现一个is_allocator<T> traits,在T是分配器的情况下,它包含一个为true的::value,而在其他情况下,它包含::false?

gstyhher

gstyhher1#

在SFINAE上下文中编写allocator_traits<T>::value_type似乎是测试T类型是否实际上是分配器的可行方法。
我认为这还不够。这只会检查T是否有一个value_type并且是可重新绑定的。libstdc和libc都将std::map<int, int>视为该模型中的分配器。
该标准有一个构成Allocator的要求表。我认为你最好的办法是检查几个表达式的有效性,即:

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

(其中X是要检查的类型,aX&nallocator_traits<X>::size_type类型的值)
如果有一种类型,检查了所有这些盒子,仍然不是一个allcoator,那么... ¯_()_/¯.

ryevplcw

ryevplcw2#

为了完整起见,下面是@巴里的答案的C++20概念:

template <typename Allocator> 
concept is_allocator = requires(Allocator a, typename Allocator::value_type* p) {
    { a.allocate(0) } -> std::same_as<decltype(p)>;
    { a.deallocate(p, 0) } -> std::same_as<void>;
};

活生生的例子

相关问题