【发布时间】:2013-02-14 19:31:00
【问题描述】:
给定类型C,它是一个符合STL 的容器,我如何正确检测C 是否包含成员函数reserve?我尝试了以下方法(使用 GCC 4.6.3):
template< typename C, typename = void >
struct has_reserve
: std::false_type
{};
template< typename C >
struct has_reserve< C, typename std::enable_if<
std::is_same<
decltype( &C::reserve ),
void (C::*)( typename C::size_type )
>::value
>::type >
: std::true_type
{};
这适用于C 是std::vector,但不适用于无序容器,例如std::unordered_set。原因是,reserve 是std::vector 的(直接)成员函数,但对于无序容器,它是从基类继承的,即它的签名不是void (C::*)( typename C::size_type ),而是void (B::*)( typename C::size_type ) 对于某些未指定的基类B 的类 C。
我知道如何解决它并检测reserve,即使是继承的,但它看起来很笨拙,我想知道标准允许什么。所以...
我的问题是:标准是否允许 reserve 从未指定的基类继承,还是概要绑定并需要直接成员函数?
【问题讨论】: