boost::enable_if 有两个条件
boost::enable_if with two conditions
正如您在以下示例中看到的,我目前使用 boost::enable_if
作为分配函数的 return 值。目标是避免抽象类型的编译错误:
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
的 class 的 classes。 有没有办法在 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;
}
或者我是否需要实施自己的 class 特质来完成这项工作?(我对此完全迷失了。我理解这个想法,但我觉得允许自己做)
备注:
- 出于兼容性原因我不使用 C++11
- 我知道
has_default_constructor
存在于 C++11 中,但在 C++11 之前不存在
boost::has_default_constructor
存在,但如果在没有 C++11 的情况下编译,则它只是 boost::has_trivial_constructor
的别名
还有
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;
}
另一个过载类似。
正如您在以下示例中看到的,我目前使用 boost::enable_if
作为分配函数的 return 值。目标是避免抽象类型的编译错误:
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
的 class 的 classes。 有没有办法在 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;
}
或者我是否需要实施自己的 class 特质来完成这项工作?(我对此完全迷失了。我理解这个想法,但我觉得允许自己做)
备注:
- 出于兼容性原因我不使用 C++11
- 我知道
has_default_constructor
存在于 C++11 中,但在 C++11 之前不存在 boost::has_default_constructor
存在,但如果在没有 C++11 的情况下编译,则它只是
boost::has_trivial_constructor
的别名
还有
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;
}
另一个过载类似。