gpt4 book ai didi

c++ - boost::enable_if 有两个条件

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:04:45 24 4
gpt4 key购买 nike

如您在以下示例中所见,我目前使用 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 的自己的类继承的类。 有没有办法在 boost::enable_if 的条件下有一个 or像这样不正确的代码:

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 存在但只是 boost::has_trivial_constructor 的别名,如果编译时没有使用 C++11

最佳答案

还有

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

与其他重载类似。

关于c++ - boost::enable_if 有两个条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52592174/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com