Статические члены и шаблоны в c ++ - PullRequest
3 голосов
/ 03 октября 2010

Учитывая код:

#include <iostream>
using namespace std;
template <typename T>
T my_max (const T &t1, const T &t2)
{
    static int counter = 0;
    counter++;
    cout << counter << " ";
    return ((t1 > t2) ? t1 : t2);
}
int main()
{
    my_max (2,3);
    my_max (3.5, 4.3);
    my_max (3,2);
    my_max ('a','c');
}

Вывод:

1 1 2 1

Я понимаю, что статический элемент инициализируется только один раз.Мой вопрос заключается в том, как компилятор запоминает, какие типы вызывали эту универсальную функцию?Что на самом деле происходит за кулисами?

Ответы [ 2 ]

8 голосов
/ 03 октября 2010

Что происходит, так это то, что компилятор создает функцию для каждого типа (конечно, используется один). Итак, у вас были бы следующие «функции» внутри:

int my_max (const int &t1, const int &t2)
{
    static int counter = 0;
    counter++;
    cout << counter << " ";
    return ((t1 > t2) ? t1 : t2);
}
...
double my_max (const double &t1, const double &t2)
{
    static int counter = 0;
    counter++;
    cout << counter << " ";
    return ((t1 > t2) ? t1 : t2);
}
...
char my_max (const char &t1, const char &t2)
{
    static int counter = 0;
    counter++;
    cout << counter << " ";
    return ((t1 > t2) ? t1 : t2);
}

Я думаю, понятно, что каждая функция независима. Они ничего не разделяют, за исключением того, что они генерируются одним и тем же кодом шаблона.

2 голосов
/ 03 октября 2010

Компилятор не запоминает типы. Он создает разные функции для разных типов.

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