Я пытаюсь создать шаблонную функцию, которая получает указатель на функцию с любым количеством входов, за исключением того, что она должна иметь int в качестве последнего ввода. Затем функция шаблона должна вызывать эту функцию с предоставленными аргументами и пятью в качестве последнего аргумента. Код прояснит это:
#include <iostream>
template<class A, class ... B>
void passFive(A (*f)(B ..., int n), B ... x) {
f(x ..., 5);
}
void printStrAndInt(const char *s, int n) {
std::cout << s << " " << n << "\n";
}
int main() {
passFive(&printStrAndInt, "pineapple");
return 0;
}
Однако g cc это не нравится и выдает ошибку вместе с примечаниями:
test.cpp: In function ‘int main()’:
test.cpp:14:39: error: no matching function for call to ‘passFive(void (*)(const char*, int), const char [10])’
passFive(&printStrAndInt, "pineapple");
^
test.cpp:4:6: note: candidate: template<class A, class ... B> void passFive(A (*)(B ..., int), B ...)
void passFive(A (*f)(B ..., int n), B ... x) {
^~~~~~~~
test.cpp:4:6: note: template argument deduction/substitution failed:
test.cpp:14:39: note: mismatched types ‘int’ and ‘const char*’
passFive(&printStrAndInt, "pineapple");
Таким образом, это выводит тип для B один раз как const char * (как и ожидалось), но также один раз как второй аргумент printStrAndInt (я уверен в этом, потому что то же самое с другими типами данных, кроме int). Как примечание стороны, это прекрасно работает, если я перемещаю int вперед, как это:
#include <iostream>
template<class A, class ... B>
void passFive(A (*f)(int n, B ...), B ... x) {
f(5, x ...);
}
void printStrAndInt(int n, const char *s) {
std::cout << s << " " << n << "\n";
}
int main() {
passFive(&printStrAndInt, "pineapple");
return 0;
}
Это не вариант для моего окончательного решения. Я хотел бы знать, почему он выводит тип таким неожиданным образом и как мне это исправить.