Как передать функцию шаблона в качестве аргумента функции шаблона? - PullRequest
0 голосов
/ 28 сентября 2019

Я хочу передать функцию шаблона в качестве аргумента функции шаблона.В функции meta_func_ok приведенного ниже кода успешно передан указатель на функцию в качестве аргумента функции шаблона.Но как шаблон, №

template    < typename N >  N
meta_func_ok( N( *f )( N ), N x ) {
    return f( x );
}

template    < typename F, typename N >  N
meta_func_ng( F f, N x ) {
    return f( x );
}

template    < typename N >  N
target_func( N x ) {
    return x;
}

int main() {
    meta_func_ok( target_func, 1 );
    meta_func_ng( target_func, 1 );     // LINE 18
    return 0;
}

Компиляция этого кода приводит к ошибке ниже.

ng.cpp: В функции 'int main ()': ng.cpp: 18:31: ошибка: нет соответствующей функции для вызова 'meta_func_ng (, int)' meta_func_ng (target_func, 1);^ ng.cpp: 7: 1: примечание: кандидат: шаблон N meta_func_ng (F, N) meta_func_ng (F f, N x) {^ ~~~~~~~~~~~ ng.cpp: 7: 1:примечание: ошибка вывода / замены аргумента шаблона: ng.cpp: 18: 31: примечание: не удалось вывести параметр шаблона 'F' meta_func_ng (target_func, 1);

Как это сделать?Заранее спасибо!

1 Ответ

2 голосов
/ 28 сентября 2019

Поддержка компилятора для вывода типов несовершенна.Во втором случае (meta_func_ng) тип N выводится из аргумента 1, но F не может быть выведен из target_func, поскольку вы не указываете явный тип для target_func 's *Параметр типа 1007 * (компилятор не настолько умен, чтобы знать, что meta_func_ng * N - это то же самое, что target_func s N).

Однако это прекрасно работает:

(same code as above here)

int main() {
    meta_func_ok( target_func, 1 );
    meta_func_ng( target_func<int>, 1 );     // LINE 18
    return 0;
}

См. Это QA: Когда компилятор может определить параметр шаблона?

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