Параметр шаблона «тип функции» и «указатель на функцию». Когда применять что? - PullRequest
3 голосов
/ 12 апреля 2020

Я пытаюсь понять разницу между «Типом функции» и «Указателем на функцию» в качестве параметра шаблона и когда что применять. Или в чем разница?

Простой пример:

template <int Function(int)>
struct S1 {
    //....
};
template <int (*Function)(int)>
struct S2 {
    //....
};

int always42(int) {
    return 42;
}

int main() {

    S1<always42> s1;
    S2<always42> s2;
    //....
    return 0;
}

Или «тип функции» превратится в «указатель на функцию»?

Может кто-нибудь скинуть? свет на это?

Ответы [ 2 ]

2 голосов
/ 12 апреля 2020

Да, тип функции настроен на указатель функции для нетипичного параметра шаблона .

Массив и типы функций могут быть записаны в объявлении шаблона, но они автоматически заменяется указателем на объект и указателем на соответствующую функцию.

[temp.param] / 10

Нетипизированный шаблон-параметр типа «массив из T» или типа функции T настраивается на тип «указатель на T».

2 голосов
/ 12 апреля 2020

Оба параметра шаблона int (*)(int), поскольку для int(int) существует спад типа. Таким образом, тип нетипичного параметра шаблона , указанного как int(int), распадается на int(*)(int).

. Вы можете увидеть, что оба параметра шаблона соответствуют одному и тому же типу, используя неполный type_shower шаблон класса ниже:

template<typename> struct type_shower;

template <int Function(int)>
struct S1 {
   type_shower<decltype(Function)> _;
};

template <int (*Function)(int)>
struct S2 {
   type_shower<decltype(Function)> _;
};

Для обоих компилятор выдает одно и то же сообщение об ошибке, в котором указан тип Function:

error: implicit instantiation of undefined template 'type_shower<int (*)(int)>' type_shower<decltype(Function)> _;


Обратите внимание, что затухание типа не происходит, если параметр шаблона указан как ссылка на функцию, т. Е. int(&)(int):

template <int (&Function)(int)>
struct S3 {
   type_shower<decltype(Function)> _;
};

error: implicit instantiation of undefined template 'type_shower<int (&)(int)>' type_shower<decltype(Function)> _;


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