сделать шаблон, чтобы определить точный тип параметра функции


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

callitcallitAcallitB

В этом примере вызов не будет выводить типы параметров, что я хочу. Первый вызов будет вывести [инт, инт, инт, инт]. Второй вызов будет вывести [константный инт

Как я могу получить поведение как в 3 ниже без явного указания параметров шаблона. Они должны быть выводимы из параметров функции.

Спасибо заранее.

void read() {}template< typename P, typename... Args >void read(const P & p, Args&... args) {   // p is a constant and shall not be written to.   read(args...);}template< typename P, typename... Args >void read(P & p, Args&... args) {   cin >> p;   read(args...);}template< typename... Args >void callitA(Args... args) {   read( args... );}template< typename... Args >void callitB(Args&... args) {   read(args...);}// b is the only variable that can be returned from funk.void funk(const int & a, int & b, const int c, int d) {   callitA(a, b, c, d);  // 1. Args will be [int, int, int, int]   callitB(a, b, c, d);  // 2. Args will be [const int &, int &, const int &, int &]   // 3. Here Args will be what I want [const int &, int &, const int, int]   callitA<const int &, int &, const int, int>(a, b, c, d);}void main() {   const int a = 1;   int b = 0;   const int c = 3;   int d = 4;   funk(a, b, c, d);   cout << b << endl;}