简体   繁体   English

模板化运算符重载技巧

[英]Templated operator overload trick

Is there a way to by using some metaprogramming trick make situation like this works: 有没有一种方法可以通过使用一些元编程技巧使这种情况起作用:

int* get();//this fnc returns pointer to int OR nullptr
int k = 1;
//this is the operator which is supposed to compare value and pointer
template<class T>
bool operator!=(const T& left, const T* right)
{
    if (right)
    {
        return left != *right;
    }
    else
    {
        return false;
    }
}


//And this is the code fragment which interests me most  
if (k != get())
{
    ///

}

The crux is that I would like NOT TO change this line k != get() and yet for some reason my operator!= seems not to work. 症结在于,我不想更改此行k!= get(),但是由于某种原因,我的operator!=似乎无法正常工作。 What's the problem? 有什么问题?

You can only overload operators with at least one user-defined type as an argument. 您只能重载至少一个用户定义类型作为参数的运算符。 Neither int nor int* are user-defined types. intint*都不是用户定义的类型。

您不能为内置类型重载运算符。

As already mentioned in other answers that you cannot have operator != for non userdefined types like int , char and so on. 正如其他答案中已经提到的那样,您不能为非用户定义类型(例如intchar等)使用operator !=

One option is to wrap int inside your user defined struct and achieve the goal. 一种选择是将int包装在用户定义的struct并实现目标。

struct Int
{
  int i;
  // define all the necessary operators/constructor who deal with 'int'
  Int(int x) : i(x) {}
  bool operator != (const int* right)
  {
    return (right)? (i != *right) : false;
  }
};

Now declare 现在声明

Int k = 1;

如何显式调用运算符 &lt; 的模板化重载<!--?</div--><div id="text_translate"><p> 考虑以下用于重载class A的operator&lt;&lt;的示例代码:</p><pre> #include &lt;iostream&gt; class A { template &lt;typename T&gt; friend A &amp;operator&lt;&lt;(A &amp;a, const T &amp;t) { std::cout &lt;&lt; t &lt;&lt; std::endl; return a; } friend A &amp;operator&lt;&lt;(A &amp;a, const std::string &amp;t) { return operator&lt;&lt;&lt;std::string&gt;(a, t + "x"); } };</pre><p> 我的意图是第二个运算符显式调用第一个运算符。</p><p> 但是,在 g++ 7.4 中,这失败了</p><blockquote><p>在 function 'A&amp; operator&lt;&lt;(A&amp;, const string&amp;)' 中:<br> 错误:'operator&lt;&lt;' 未定义<br>返回运算符&lt;&lt;&lt;std::string&gt;(a, t + "x");<br> ^~<br> 错误:“&gt;”标记之前的预期主表达式<br>返回运算符&lt;&lt;&lt;std::string&gt;(a, t + "x");<br> ^</p></blockquote><p> 然而,我不明白为什么这不应该编译。</p><p> <a href="https://godbolt.org/z/ckKDXH" rel="nofollow noreferrer">这是godbolt中的代码。</a></p></div> - How to explicity call a templated overload of operator <<?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 模板化 operator=() 和重载决议 - Templated operator=() and overload resolution 模板化方法中的运算符重载 - Operator overload in a templated method 模板化类中运算符[]的可变参数化模板重载 - variadic templated overload of operator [] in templated class 定义模板运算符重载时出错 - Error defining a templated operator overload 带有模板操作符重载的奇怪错误 - Strange error with a templated operator overload 模板化的operator()重载C ++ - templated operator() overload C++ operator =模板类的重载 - operator= Overload from a templated class 模板化运算符重载中的成员函数不起作用 - Member function inside templated operator overload not working 如何显式调用运算符 &lt; 的模板化重载<!--?</div--><div id="text_translate"><p> 考虑以下用于重载class A的operator&lt;&lt;的示例代码:</p><pre> #include &lt;iostream&gt; class A { template &lt;typename T&gt; friend A &amp;operator&lt;&lt;(A &amp;a, const T &amp;t) { std::cout &lt;&lt; t &lt;&lt; std::endl; return a; } friend A &amp;operator&lt;&lt;(A &amp;a, const std::string &amp;t) { return operator&lt;&lt;&lt;std::string&gt;(a, t + "x"); } };</pre><p> 我的意图是第二个运算符显式调用第一个运算符。</p><p> 但是,在 g++ 7.4 中,这失败了</p><blockquote><p>在 function 'A&amp; operator&lt;&lt;(A&amp;, const string&amp;)' 中:<br> 错误:'operator&lt;&lt;' 未定义<br>返回运算符&lt;&lt;&lt;std::string&gt;(a, t + "x");<br> ^~<br> 错误:“&gt;”标记之前的预期主表达式<br>返回运算符&lt;&lt;&lt;std::string&gt;(a, t + "x");<br> ^</p></blockquote><p> 然而,我不明白为什么这不应该编译。</p><p> <a href="https://godbolt.org/z/ckKDXH" rel="nofollow noreferrer">这是godbolt中的代码。</a></p></div> - How to explicity call a templated overload of operator <<? 避免模​​板化运算符重载的隐式参数转换 - Avoid implicit argument conversion of templated operator overload
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM