2016-04-25 4 views
0

(Ich kann keinen Namen für dieses Paradigma finden, aber Sie werden einen Bonus-Upvote bekommen, wenn Sie können!) Dieses Template-Paradigma wird verwendet, um zu verhindern, dass ein Array abfällt ein Zeiger:Verwenden des Array-Template-Parameters für eine Rückgabe

template <size_t N> 
void foo(const char (&bar) [N]); 

Live Example

Wir sind in der Lage N im Körper von foo zu verwenden, um die Größe aus bar zu erhalten. Mit const char array[] = "lorem ipsum" verwenden wir diesen Aufruf foo(array), um bar als const char (&) [12] zu definieren, effektiv 2 Parameter für den Preis von einem übergeben.


Ich möchte diese gleiche Idee verwenden, aber in einer Rückkehr zum Beispiel:

template <size_t N> 
const char (&) [N] foo(const char (&bar) [N]); 

so, dass ich das Array durch und haben einen weiteren Hinweis auf sie passieren könnte, wie zum Beispiel: auto result = foo(bar)

Der Code habe ich hier ergibt den Fehler:

unrecognizable template declaration/definition

ist das möglich?

EDIT:

Zur Klarstellung, ich möchte eine Funktion Rückkehr zu müssen in der Lage sein, die in dem Äquivalent führen:

auto& result = bar; 

Derart, dass result wird ein const char (&) [*] wo * ist die Größe von bar.

+1

Es heißt "durch Referenz" :-) –

+0

@KerrekSB Hmmm ... Ich hatte auf etwas etwas exotischer gehofft, aber ich nehme an, es ist: J –

Antwort

3

C++ Syntax ist wunderbar:

template <std::size_t N> 
const char (&f(const char (&arr)[N]))[N] // take that, Lisp 
{ 
    return arr; 
} 

Für die weniger masochistisch:

template <std::size_t N> using CarrN = const char[N]; 

template <std::size_t N> 
CarrN<N> & f(CarrN<N> & arr) 
{ 
    return arr; 
} 

Was Terminologie: Wir in der Regel sagen, dass "arr ist Referenz zu übergeben", wenn auch die anspruchsvolleren Benutzer könnte sagen "als Lvalue übergeben" (und auch als solcher zurückgegeben).

+0

[Demo] (http://ideone.com/ WFwQ3G). –

+0

Das scheint nicht für mich zu funktionieren: http://ideone.com/kremY0 –

+0

Errr ... Entschuldigung, wenn ich das beheben, zeigt es, worüber ich rede. 'test' ist ein' const char * & 'nicht ein' const char (&) [12] '. Es ist Größe Ausgänge als 4. –