2011-06-30 62 views
11

假设我有一些模板类,具体取决于类型TT几乎可以是任何东西:int,int*,pair <int, int>struct lol;它不能是void,参考或任何cv-qualified虽然。对于一些优化,我需要知道我是否可以继承T。所以,我需要一些特质类型is_subclassable,这些特质被确定为基本特征或通过一些SFINAE技巧的逻辑组合。C++模板:如何确定类型是否适合子类化

在原始示例中,intint*不是可分类的,而pair <int, int>struct lol是。

编辑:正如以下指出的,工会也不是可分类的,并且T也可以是工会类型。

如何编写我需要的特征类型?

+2

嗯。 [is_class](http://msdn.microsoft.com/en-us/library/bb982638.aspx)是否足够?不确定。 –

回答

13

你想确定它是否是一个非联合类。我无法做到这一点(并且提升还没有找到方法)。如果您能承受工会案件的误判,您可以使用is_class

template<typename> struct void_ { typedef void type; }; 

template<typename T, typename = void> 
struct is_class { static bool const value = false; }; 

template<typename T> 
struct is_class<T, typename void_<int T::*>::type> { 
    static bool const value = true; 
}; 

升压具有使用特定的编译器内建虽然一个is_union,这将帮助你在这里。 is_class(其中boost也提供)结合is_union将解决您的问题。

+0

我完全忘记了工会案件。不幸的是,误报是不可接受的。错过了,因为这毕竟是一种优化。 – doublep

+0

@doublep然后,除非你使用C++ 0x,我不认为它是可移植的方式解决。 –

+0

是的,我想我必须在C++ 0x支持条件下进行优化,否则就放弃它。 – doublep

相关问题