Шаблонный трюк перегрузки оператора - PullRequest
1 голос
/ 26 июля 2011

Есть ли способ, с помощью какого-нибудь трюка с метапрограммированием, создать ситуацию, подобную этой:

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())
{
    ///

}

Суть в том, что я не хотел бы изменять эту строку k! = Get (), и все же для некоторыхпричина мой оператор! = кажется, не работает.В чем проблема?

Ответы [ 3 ]

6 голосов
/ 26 июля 2011

Вы можете перегружать операторы, по крайней мере, с одним пользовательским типом в качестве аргумента.Ни int, ни int* не являются пользовательскими типами.

3 голосов
/ 26 июля 2011

Вы не можете перегружать операторы для встроенных типов.

2 голосов
/ 26 июля 2011

Как уже упоминалось в других ответах, у вас не может быть operator != для не определенных пользователем типов, таких как int, char и т. Д.

Один из вариантов - обернуть 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;
  }
};

Теперь объявите

Int k = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...