【发布时间】:2016-02-24 15:52:58
【问题描述】:
有这个功能:
template <typename T>
T operator-(const T vector)
{}
我想强制 T 具有 x 和 y 成员,并且它们是算术的。
我试图通过std::declval<T>:
template <typename T,
typename = typename
std::enable_if<std::is_arithmetic<std::declval<T>.x>::value>::type,
typename = typename
std::enable_if<std::is_arithmetic<std::declval<T>.y>::value>::type>
T operator-(const T vector)
{}
但我得到的只是,无法推断出类型:error: insufficient contextual information to determine type。模板参数对象的成员类型可以推导出来吗?
【问题讨论】:
-
语法
std::declval<T>.x只能用于对象,不能用于类型。 -
@RSahu:没错。我没有注意到这一点。谢谢。那么是否有可能在编译时找出传递对象的成员类型呢?
-
我尝试使用
std::is_arithmetic<typename T::x>::value,它可以编译,但它似乎不起作用。 -
decltype(std::declval<T>().x),或decltype(T::x)。 -
@T.C.后者可能会无意中对重载运算符点的 C++17 类给出错误否定。 :o)
标签: c++ templates c++14 type-deduction