我想为使用std::allocator
完成的分配提供专门的优化,但是如果有人将子类化为而没有覆盖allocate
或deallocate
,那么我就不会我知道如何检测他们是否仍在使用std::allocator
。
我该怎么做?
答案 0 :(得分:1)
假设他们没有定义自己的allocate
和deallocate
函数,那么测试的一种方法是测试值
is_default_allocator_allocation<allocator_type>::value
测试allocate
和deallocate
方法是否为默认方法。
如果 提供了自己的功能,那么就没有通用的测试方法。
此解决方案不查看其他方法 它可以偶尔给你带来假阴性,但不应该给出误报。
我的实施:
template<class Ax> char (&is_default_deallocate(void (std::allocator<typename Ax::value_type>::*)(typename Ax::pointer, typename Ax::size_type)))[1];
template<class Ax> char (&is_default_deallocate(void (Ax::*)(typename Ax::pointer, typename Ax::size_type)))[2];
template<class Ax> char (&is_default_allocate(typename Ax::pointer (std::allocator<typename Ax::value_type>::*)(typename Ax::size_type, void const *)))[1];
template<class Ax> char (&is_default_allocate(typename Ax::pointer (Ax::*)(typename Ax::size_type, void const *)))[2];
template<class Ax>
struct is_default_allocator_allocation // tests allocate() and deallocate()
{
static bool const value =
sizeof(is_default_deallocate<Ax>(&Ax::deallocate)) == sizeof(char)
&& sizeof(is_default_allocate<Ax>(&Ax::allocate)) == sizeof(char);
};