enable_if 方法专门化
template<typename T>
struct A
{
A<T> operator%( const T& x);
};
template<typename T>
A<T> A<T>::operator%( const T& x ) { ... }
如何使用enable_if使任何浮点类型(is_floating_point)发生以下专门化?
template<>
A<float> A<float>::operator%( const float& x ) { ... }
编辑: 这是我提出的一个答案,它与下面发布的答案不同...
template<typename T>
struct A
{
T x;
A( const T& _x ) : x(_x) {}
template<typename Q>
typename std::enable_if<std::is_same<Q, T>::value && std::is_floating_point<Q>::value, A<T> >::type operator% ( const Q& right ) const
{
return A<T>(fmod(x, right));
}
template<typename Q>
typename std::enable_if<std::is_convertible<Q, T>::value && !std::is_floating_point<Q>::value, A<T> >::type operator% ( const Q& right ) const
{
return A<T>(x%right);
}
};
就像下面的海报所说,使用enable_if可能不适合这个问题(很难阅读)
template<typename T>
struct A
{
A<T> operator%( const T& x);
};
template<typename T>
A<T> A<T>::operator%( const T& x ) { ... }
How can I use enable_if to make the following specialization happen for any floating point type (is_floating_point)?
template<>
A<float> A<float>::operator%( const float& x ) { ... }
EDIT:
Here's an answer I came up which is different from the ones posted below...
template<typename T>
struct A
{
T x;
A( const T& _x ) : x(_x) {}
template<typename Q>
typename std::enable_if<std::is_same<Q, T>::value && std::is_floating_point<Q>::value, A<T> >::type operator% ( const Q& right ) const
{
return A<T>(fmod(x, right));
}
template<typename Q>
typename std::enable_if<std::is_convertible<Q, T>::value && !std::is_floating_point<Q>::value, A<T> >::type operator% ( const Q& right ) const
{
return A<T>(x%right);
}
};
Like the below posters say, using enable_if may not be ideal for this problem (it's very difficult to read)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
当您想要优化更具体的参数类型的行为时,请使用重载而不是显式专业化。它更容易使用(更少的惊喜)和更强大
一个使用 SFINAE (
enable_if
) 的例子,因为你似乎很好奇当然更难看。我认为没有理由在这里使用
enable_if
。这太过分了。Use overloading instead of explicit specialization when you want to refine the behavior for a more specific parameter type. It's easier to use (less surprises) and more powerful
An example that uses SFINAE (
enable_if
) as you seem to be curiousWay more ugly of course. There's no reason to use
enable_if
here, I think. It's overkill.使用 C++20
只需添加
requires
来限制相关模板函数即可实现这一点:requires
子句获取一个常量表达式
,其计算结果为true
或false
,从而决定是否在重载决策中考虑此方法(如果requires子句为true)该方法优于另一种没有 require 子句的方法,因为它更专业。代码:https://godbolt.org/z/SkuvR9
With C++20
You can achieve that simply by adding
requires
to restrict the relevant template function:The
requires
clause gets aconstant expression
that evaluates totrue
orfalse
deciding thus whether to consider this method in the overload resolution, if the requires clause is true the method is preferred over another one that has no requires clause, as it is more specialized.Code: https://godbolt.org/z/SkuvR9
您还可以使用默认布尔模板参数,如下所示:
You can also use a default boolean template parameter like this: