在检查成员是否存在,可能在基类中,C++11 版本中,我们开发了 SFINAE 的经典成员检查类型特征的 C++11 版本,以检查也适用于 C++的继承的成员函数11 个final
类,但也使用 C++11 特性(即decltype
):
template<typename T>
class has_resize_method {
struct Yes { char unused[1]; };
struct No { char unused[2]; };
static_assert(sizeof(Yes) != sizeof(No));
template<class C>
static decltype(std::declval<C>().resize(10), Yes()) test(int);
template<class C>
static No test(...);
public:
static const bool value = (sizeof(test<T>(0)) == sizeof(Yes));
};
MSVC自 VS2005 起final
作为非标准扩展名,但仅在 VS2010 中添加。剩下的 VS2005 和 2008 中,标记为的类仍然破坏了经典的类型特征,并且不能使用 C++11 版本。sealed
decltype
sealed
那么,有没有办法制定has_resize_method
它也适用于 VC2005/08sealed
类?
显然,正如使用仅限 C++11 的功能来解决仅限 C++11 的final
问题sealed
(如果有一个适用于所有三组编译器 {C++11,{VS2005,VS2008},all others} 的解决方案,那会很酷,但可能要求太多了:)