gpt4 book ai didi

c++ - enable_if 方法特化

转载 作者:可可西里 更新时间:2023-11-01 14:53:03 33 4
gpt4 key购买 nike

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) {
return opModIml(x, std::is_floating_point<T>());
}

A<T> opModImpl(T const& x, std::false_type) { /* ... */ }
A<T> opModImpl(T const& x, std::true_type) { /* ... */ }
};

一个使用 SFINAE (enable_if) 的例子,你似乎很好奇

template<typename T>
struct A
{
A<T> operator%( const T& x) {
return opModIml(x);
}

template<typename U,
typename = typename
std::enable_if<!std::is_floating_point<U>::value>::type>
A<T> opModImpl(U const& x) { /* ... */ }

template<typename U,
typename = typename
std::enable_if<std::is_floating_point<U>::value>::type>
A<T> opModImpl(U const& x) { /* ... */ }
};

当然更丑。我认为没有理由在这里使用 enable_if。这太过分了。

关于c++ - enable_if 方法特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6627651/

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