Перегрузка оператора в шаблоне в C ++ - PullRequest
8 голосов
/ 23 августа 2011

Я где-то читал следующий код:

template<class T> class A {
    T a;
public:
    A(T x):a(x) {}
    operator T() const {return a;}   // what is point here?
};


int _tmain(int argc, _TCHAR* argv[])
{
    A<int> a = A<int>(5);
    int n = a;
    cout << n;
    return 0;
}

Что означает нижняя строка?

оператор T () const {return a;}

Ответы [ 3 ]

4 голосов
/ 23 августа 2011

оператор T () const {return a;}

Это оператор typecast .Это неявно преобразует экземпляр класса в T.В приведенном вами примере кода это преобразование выполняется в строке

int n = a;

3 голосов
/ 23 августа 2011

Это означает, что если вы хотите преобразовать экземпляр в T, вы можете использовать этот оператор, который здесь возвращает копию закрытого члена.

В вашем примере кода вы можете назначить a, который имеет тип от A<int> до int напрямую.Попробуйте удалить operator T() и посмотрите, как это не скомпилируется, с ошибкой при назначении A<T> int.

с конструктором не explicit (противоположным обозначению конструктора explicit) там также он заставляет этот тип вести себя во многом как сам тип шаблона в ряде обстоятельств.По сути, вы обернули T в другой класс, который ведет себя как T, когда это необходимо.Вы можете расширить это, чтобы выполнять другие, более полезные вещи, такие как мониторинг / регистрация / ограничение использования реальных экземпляров, скрывая их за чем-то, что контролирует их.

Также обратите внимание, как вы можете изменить A<int> a = A<int>(5); на просто A<int> a = 5; из-за неявного конструктора.

0 голосов
/ 23 августа 2011

Это в основном создание функтора - объекта с семантикой функции.Это означает, что вы можете вызывать объект как функцию в качестве замены в тех местах, где вы могли использовать функцию - это общая концепция программирования.

Это полезно, потому что вы можете иметь несколько экземпляров этого объекта-функции (functor), и каждый из них может поддерживать свое собственное состояние, где, как если бы у вас была прямая функция, он мог поддерживать состояние только через статические переменные, и, таким образом, он не был бы повторно входящим (вы когда-либо получаете только один экземпляр статическогопеременная).

Функторы интенсивно используются в алгоритмах STL в качестве дополнительного необязательного параметра.

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