具有两个条件的boost :: enable_if

时间:2018-10-01 13:24:04

标签: c++ boost typetraits c++03

如下面的示例所示,我当前使用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;
}

还是让我在工作中实现自己的特质?(对此我完全迷失了。我理解这个主意,但我觉得自己可以做到)

注意:

  • 出于兼容性原因,我不使用C ++ 11
  • 我知道has_default_constructor存在于C ++ 11中,但不存在于C ++ 11中
  • boost::has_default_constructor存在,但如果不使用C ++ 11进行编译,则仅为boost::has_trivial_constructor的别名

1 个答案:

答案 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;
}

,其他过载类似。