Рассмотрим следующее (которое не компилируется , но мы исправим это в ближайшее время):
void foo(const int *n) { }
template <typename ...Args>
void bar(void (*func)(Args...), Args... args) { func(args...); }
int main(int argc, char *argv[])
{
int n = 42;
bar(foo, &n);
}
Функция шаблона bar()
принимает указатель функции для вызова и пакет параметров для передачи ей. gcc 7.4.0 диагностирует следующую ошибку:
test.cpp:6:6: note: template argument deduction/substitution failed:
test.cpp:11:16: note: inconsistent parameter pack deduction with ‘const int*’ and ‘int*’
Очевидно, что правила удержания типа недостаточно ослаблены, чтобы можно было вывести const T*
при соблюдении const T*
и T*
. Хорошо. Это достаточно легко исправить с помощью приведения :
bar(foo, static_cast<const int *>(&n));
Но это безобразно. C ++ 17 имеет std::as_const()
, что делает его немного менее уродливым (&std::as_const(n)
), но в моем текущем проекте я ограничен C ++ 14, sadface.
Q : Есть ли способ перегруппировать этот код так, чтобы вывод типа выполнялся успешно без явного указания параметров шаблона для bar()
и без приведения для разрешения неоднозначной константности? Разрешается нестандартное мышление, если я могу передать указатель на функцию и ее аргументы в шаблонную функцию!