我建议您尝试专注于检测在您的情况下需要可继承的类型的属性,而不是考虑检测那些不可继承的类型。运气好的话,您的类需要基类中可以检查的其他属性,因为您的派生类将需要调用基类的至少一个构造函数。
尝试使用is_constructible
或一些相关的类型特征:
// check that T::T(std::string,int); exists:
std::is_constructible< T, std::string, int >::value
// or these direct traits for the usual suspects...
std::is_default_constructible< T >::value
std::is_copy_constructible< T >::value
std::is_move_constructible< T >::value
对于您的其他问题,如果在上述之后仍然相关,请检查std::decay
并将其与其他特征结合以根据需要剥离类型:
template< typename T, typename = void >
struct strip
{
typedef T type;
};
template< typename T >
struct strip< T, typename std::enable_if<
!std::is_same< typename std::decay< T >::type, T >::value
>::type >
: strip< typename std::decay< T >::type >
{
};
template< typename T >
struct strip< T, typename std::enable_if<
std::rank< T >::value != 0
>::type >
: strip< typename std::remove_all_extents< T >::type >
{
};
template< typename T >
struct strip< T, typename std::enable_if< std::is_pointer< T >::value >::type >
: strip< typename std::remove_pointer< T >::type >
{
};
typedef const int*(&Test)[42];
static_assert( std::is_same< typename strip< Test >::type, int >::value, "" );
但是当然,您需要弄清楚您的情况到底适合什么。