【发布时间】:2014-10-01 10:16:56
【问题描述】:
如果缺少operator+=,我正在尝试从重载集中消除重载。
我知道如何检查T+T 是否合法:
template<typename T,
typename CheckTplusT = decltype(std::declval<T>() + std::declval<T>())>
void foo(T a, T b, ...)
{
a = a + b;
}
但这不适用于+=
template<typename T,
typename CheckTplusT = decltype(std::declval<T>() += std::declval<T>())>
void foo(T a, T b, ...)
{
a += b;
}
这是否可以通过在 decltype 中使用另一个表达式来解决,还是我需要另一个 SFINAE 构造?
我需要从重载集中消除它的原因是它与另一个重载冲突,该重载接受函子作为+= 的替代品。编译器为VS2013、gcc4.8
【问题讨论】:
-
您致电
foo的哪种形式不起作用? -
@PiotrS。 : 第二种形式不行。您不能在右值
std::declval<T>()上调用 +=(非常量方法)。但是你可以在右值上调用 + 。比较 2+2 和 2+=2 -
@MSalters 如果
+=是一个方法,您可以在右值上调用它(除非该方法具有&限定符)。问题在于内置+=和基本类型。 -
@dyp:我希望将此方法用于 short、float、double 和
std::complex<>。 -
虽然这个问题已经得到了很好的回答,但如果你有可用的 Boost,你也可以使用
enable_if。 Boost.TypeTraits'boost::has_plus_assign可以工作。这可能是首选的非 C++11 选项。