如下面的示例所示,我当前使用boost::enable_if
作为分配函数的返回值。目的是避免抽象类型的编译错误:
template <typename T>
typename boost::enable_if<boost::is_abstract<T>,T*>::type no_abstract_new()
{
assert(false);
return 0;
}
template <typename T>
typename boost::disable_if<boost::is_abstract<T>,T*>::type no_abstract_new()
{
return new T;
}
现在,我还想排除继承自名为has_no_default_constructor
的类的类。 有没有办法在or
的情况下拥有boost::enable_if
?像这样的不正确代码:
template <typename T>
typename boost::enable_if<boost::is_abstract<T>
|| boost::is_base_of<has_no_default_constructor,T>,T*>::type default_constructor_new()
{
assert(false);
return 0;
}
template <typename T>
typename boost::disable_if<boost::is_abstract<T>
|| boost::is_base_of<has_no_default_constructor,T>,T*>::type default_constructor_new()
{
return new T;
}
还是让我在工作中实现自己的特质?(对此我完全迷失了。我理解这个主意,但我觉得自己可以做到)
注意:
has_default_constructor
存在于C ++ 11中,但不存在于C ++ 11中boost::has_default_constructor
存在,但如果不使用C ++ 11进行编译,则仅为boost::has_trivial_constructor
的别名答案 0 :(得分:1)
还有
template <bool B, class T = void> struct enable_if_c;
请注意,它以bool
作为第一个参数而不是类型。因此,以下应该没问题
template <typename T>
typename boost::enable_if_c<boost::is_abstract<T>::value
|| boost::is_base_of<has_no_default_constructor,T>::value
,T*>::type default_constructor_new()
{
assert(false);
return 0;
}
,其他过载类似。