Intencją przekazując dowolną surowy wskaźnik do funkcji jest rozmówca ma jakiś pomysł:
- Co wskazuje na.
- Ile to wskazuje.
Łańcuchy w stylu C jako parametry wejściowe mają te ostatnie wywnioskowane, ponieważ zakłada się, że "ilu" jest uważane za przybycie do terminatora o wartości zerowej char.
Ale co, jeśli jesteś , a nie przekazujesz ciąg znaków w stylu C? Co jeśli jest to po prostu sekwencja zerowych lub więcej wartości char
? Cóż, jeśli tak jest, to:
void f(const char *s)
{
// how many char does s refer to?
}
logiczna dedukcja byłoby to zrobić:
void f(const char *s, std::size_t N)
{
// Now the caller is telling us there are N chars at s
}
a to nie jest rzadkością w ogóle, choć potencjalnego punktu błąd, jeśli rozmówca przekazuje nam niewłaściwą długość (nigdy nie mów nigdy).
Co jednak, jeśli istnieje sposób, aby przesiać dane z rzeczywistej zmiennej typu przekazywane do funkcji za pomocą dedukcji za pomocą parametru szablonu nie typu? Co jeśli dzwoniący wywołuje nas ze stałą tablicą?
template<std::size_t N>
void f(const char(&ar)[N])
{
// we know the caller is passing a const-reference to a
// char array declared of size N. The value N can be used
// in this function.
}
Teraz znamy obie pozycje z naszej listy: "co" i "ile".Ponadto, możemy teraz zapewnić zarówno funkcję szablonu oraz przeciążenie i mają oba światy dostępne do nas:
// length specified implementation
void f(const char *s, std::size_t N)
{
// caller passed N
}
// fixed buffer template wrapper
template<std::size_t N>
void f(const char(&ar)[N])
{
f(ar,N); // invokes length-specified implementation from above.
}
I obie z poniższych będzie działać:
int main()
{
char buff[3];
f(buff,3);
f(buff);
}
Więc jak jest ten dobry? Ponieważ następnego oznaczy błąd kompilatora, a nie realizacja dopasowywania można znaleźć:
int main()
{
char buff[3];
const char *ptr = buff;
f(ptr); // ERROR: no matching function f(const char *)
}
Podsumowując jest to powszechną techniką, aby pomóc w zapewnieniu obie pozycje na naszej liście pocisku do wywoływany: „co” i "ile", bez konieczności posiadania długiej ręki sizeof(ar)/sizeof(*ar)
za każdym razem, gdy jako parametr wejściowy używasz natywnej macierzy o stałej długości.
Powodzenia.
Co oznacza "a" w drugim przykładzie? Pojedynczy 'int'? Prosta tablica? Ciąg C? Tablica zakończona znakiem NUL? Widzisz mój punkt? – Shoe