関数パラメーターの正確なタイプを推測するためのテンプレートを取得するのに問題があります。
この例では、callitの呼び出しは、必要なパラメーターの型を推測しません。callitAの最初の呼び出しは[int, int, int, int] を推測します。callitBの 2 回目の呼び出しは、[const int &, int &, const int &, int &] を推測します。テンプレートの特定のインスタンス化を行った場合にのみ、正しいパラメーターを取得できます。
テンプレート パラメーターを明示的に指定せずに、以下の 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;
}