C++ 如何检查操作员!=具有C++;17?
我有以下用例:C++ 如何检查操作员!=具有C++;17?,c++,templates,operators,c++17,C++,Templates,Operators,C++17,我有以下用例: template<typename T> struct Foo { bool setValue(T const &iValue) { if(fValue != iValue) { fValue = iValue; return true; } return false; } T fValue; }; 我该怎么做呢?请注意,我使用C++ 17,因此我们更喜欢使用最新和最大特征的解决方案(
template<typename T>
struct Foo
{
bool setValue(T const &iValue)
{
if(fValue != iValue)
{
fValue = iValue;
return true;
}
return false;
}
T fValue;
};
我该怎么做呢?请注意,我使用C++ 17,因此我们更喜欢使用最新和最大特征的解决方案(如<代码> >如果CONTXPRPR <代码>代码比我们通常看到的SIMEAE……选择的虚拟模板函数参数更容易阅读/理解)< /P> < P>用检测习语很容易做到:
template<typename T>
using operator_not_eq_t = decltype(std::declval<T const&>() != std::declval<T const&>());
template<typename T>
constexpr auto is_diff_operator_defined = is_detected_v<operator_not_eq_t, T>;
看一看灵感,这是一个比编写特定特征来检查操作符更高的抽象级别的习语。这确实有效,但我只想指出,
是检测到的
目前在
中定义的,它不适用于Visual Studio Build tools 2017。它确实适用于XCode 9.2。因此,为了实现跨平台,我必须将XCode中的代码复制/改编到我的源代码中,以便它在两种平台上都能工作。@yan检测习惯用法当然可以在visual studio 2019、2017和2015上工作,甚至可能更老。要做到这一点,您只需在几行代码中实现,并自信地在任何地方使用它。这正是我在评论中所说的:“我必须将XCode中的代码复制/改编到我的源代码中,以便它在两种平台上都能工作”。感谢您指出,您也可以在旧版本中移植它。
template<typename T>
using operator_not_eq_t = decltype(std::declval<T const&>() != std::declval<T const&>());
template<typename T>
constexpr auto is_diff_operator_defined = is_detected_v<operator_not_eq_t, T>;
if constexpr (requires { fValue != iValue; }) {
if (fValue != iValue) {
// ...
}
}