Как / где расположены шаблоны-функции? - PullRequest
0 голосов
/ 11 марта 2012

Правильно ли следующее использование функции шаблона fCompare()?

// заголовок

template<typename _T > class SomeClass
{
    typedef int (*COMPAREFUNC)(_T*,_T*);
    COMPAREFUNC Compare;
public:
    void SetCompareFunction(COMPAREFUNC pfC) { Compare=pfC; }
    ...
};

template<typename _T > int fCompare(_T *pO, _T *pN)
{
    if (pN==NULL) throw (const char*)"Null not allowed";
    if (pO!=NULL) return (*pO > *pN)?1:(*pO < *pN)?(-1):0;
    return 0;
}

// код

    SomeClass<int> aC;

    aC.SetCompareFunction(fCompare<int>); //                <******* here
    ...   

Меня беспокоит, когда функция экземпляра создается из шаблона: она выглядит как стек, но в другом коде, который я использовал для его тестирования, я пытался забить стек, а Compare() просто продолжал идти. Могу ли я безопасно использовать такой шаблон?

Ответы [ 2 ]

1 голос
/ 11 марта 2012

fCompare<int> создается во время компиляции как часть сегмента кода. Вы можете думать об этом как о неких постоянных статических данных, как это было бы const int в области видимости файла. Поэтому каждый раз, когда вы вызываете SetCompareFunction, он получает указатель на той же функции . Таким образом, независимо от того, сколько раз вы вызываете его, он не израсходует лишней памяти, и вам не хватит места в стеке или куче только из-за этого.

Следствием этого является то, что аргументы функции шаблона всегда должны быть чем-то, что может быть вычислено во время компиляции. Недопустимо передавать переменную (кроме переменной шаблона) в качестве параметра шаблона.

1 голос
/ 11 марта 2012

Насколько я могу сказать, да. Расширенные функции шаблона такие же, как обычные функции; в вашем примере fCompare будет таким же, как и независимая функция с именем fCompare_int, в которой вместо параметра шаблона будет использоваться int. Поскольку вы фактически просто берете адрес в вызове функции, все хорошо.

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