dieses klassische Beispiel vor:Wie kann der Parameter einer conexpr-Funktion unbenutzt markiert werden?
template <typename T, std::size_t N>
constexpr std::size_t arraySize(T (&array)[N]) noexcept { return N; }
Jetzt das funktioniert gut, aber es ist ein Ärgernis, gcc gibt eine Warnung aus:
warning: unused parameter ‘array’ [-Wunused-parameter]
Bekannte Lösungen:
- Doesn‘ t Arbeit: Wenn ich die klassische
(void)arr;
der Funktion hinzufüge, bekomme icherror: body of constexpr function ‘...‘ not a return-statement
. - Unbefriedigende: Ich kann
arraySize(T (&)[N])
haben, aber ich möchte das Argument aus zwei Gründen nennen:- Es macht Compiler-Fehlermeldung mehr verständlich.
- Mehr subjektiv, ich denke, es macht den Code klarer, vor allem für diejenigen, die nicht leben und atmen diese Syntax.
- Nicht gut: In diesem speziellen Beispiel, ich könnte auch
return sizeof(array)/sizeof(array[0]);
, aber dieser Ansatz ist nicht universelle Lösung, und auch ich denke,return N;
ist viel schöner, auf jeden Fall auf dem Auge zu erleichtern. - Gut, aber nicht immer möglich: Wechseln Sie zu C++ 14 und Compiler, der es vollständig unterstützt. Dann ist constexpr Funktionskörper wie
{ (void)array; return N; }
erlaubt.
Wie kann ich den nicht genutzten Parameter schön loszuwerden, Warnung, wenn C++ 11 mit?
Ich bin nicht auf meinem Laptop, sondern einfach mit 'ArraySize (T *)' (ohne Namen für Sie tun brauche es nicht) löst nicht? Natürlich, mit dem richtigen Typ, tut mir leid, wenn ich nicht versuchen kann für Sie ... – skypjack
@skypjack Wie ich es verstehe, ist ein Verweis auf Array erforderlich. Andernfalls kann der Compiler nicht automatisch 'N' geben. Deshalb wird 'arraySize (T [N])' auch nicht funktionieren (getestet, kompiliert nicht, ohne explizit 'N' als Template-Argument anzugeben, wenn die Funktion aufgerufen wird). – hyde
'arraySize (T (&) [N])'? Das sollte funktionieren, aber ich bin mir nicht sicher über die Warnung, denn ich kann es nicht versuchen. Wenn es in Ordnung ist, werde ich eine Antwort geben. – skypjack