パラメータパックから展開された引数で配列からポインタへの減衰を防ぐことは可能ですか?
例えば:
#include <iostream>
void foo() {
std::cout << "empty\n";
}
template <typename T, typename... Rest>
void foo(T &&t, Rest... rest) {
std::cout << "T, ...\n";
foo(rest...);
}
template <typename... Rest>
void foo(char *p, Rest... rest) {
std::cout << "char*, ...\n";
foo(rest...);
}
template <int N, typename... Rest>
void foo(char (&first)[N], Rest... rest) {
std::cout << "char[], ...\n";
foo(rest...);
}
int main() {
char a[2], b[2], c[2];
foo(a, b, c);
}
...出力:
char[], ...
char*, ...
char*, ...
empty
ご覧のとおり、最初の呼び出しは配列ベースのオーバーロードに行きますが、その後の呼び出しはポインターベースのオーバーロードに行きます。 すべての呼び出しを配列ベースのオーバーロードに移動する方法はありますか?