Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何检查操作员!=具有C++;17?_C++_Templates_Operators_C++17 - Fatal编程技术网

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) {
        // ...
    }
}