2013-05-08 5 views
6

Wie kann man eine using-Anweisung in eine Konstruktorinitialisierungsliste aufnehmen?Kann eine using-Anweisung in einer Konstruktorinitialisierungsliste angezeigt werden?

Zum Beispiel, anstatt

foo::foo(int a, int b, int c) : a(a), b(b), c(something_long::tada(c)) {} 

Ich möchte

// Invoking some 'using something_long::tada;' magic 
foo::foo(int a, int b, int c) : a(a), b(b), c(tada(c)) {} 

haben Vermutlich sieht dies so etwas wie das doof try/catch-Syntax in diesem Code Region erforderlich. Funktionell erlaubt das Verwenden von Anweisungen das Gefühl, dass something_long::tada(c) und using something_long::tada; tada(c) unterschiedliche Verhaltensweisen pro Koenig-Lookup haben können.

Antwort

1

Als eine sehr grobe Hack, eine Sache, die Sie tun könnten, wäre, zwei separate Implementierungsdateien zu haben. Eine der Implementierungsdateien wäre eine normale Implementierungsdatei, in der Sie den Konstruktor außer implementieren würden. In der zweiten Implementierungsdatei, dann würden Sie

#include "appropriate-header-file" 
using namespace something_long; 

foo::foo(int a, int b, int c): a(a), b(b), c(tada(c)) {}; 

Auf diese Weise tun, wenn der Konstruktor kompilieren, muss der Compiler die using Erklärung tada kürzer zu machen. Dies verschmutzt jedoch den Namespace in der Standardimplementierungsdatei nicht.

Hoffe, das hilft!

+0

Vielleicht wrap 'something_long :: tada (c)' in einer neuen Funktion? wie statische private Funktion. – billz

+0

Clever, aber ich bin mir nicht sicher, ob der zusätzliche Aufwand, eine separate Header-Datei zu erstellen, wirklich einen Namespace ausgibt. – Yuushi

+0

@ Yuushi- Dies ist nur ein Beweis des Konzepts, das zeigt, dass es prinzipiell möglich ist, dies zu tun. Obwohl ich völlig zustimme! – templatetypedef

2

Es hängt davon ab, wie viele Namespacesbenen Sie eingeben müssen. Wenn Sie schon einige Stufen von Namensräumen geben, können Sie es in einer statischen Funktion überbrücken:

class foo 
{ 
    //... 
    static int tada_again(int c) 
    { 
    return namespaceA::namespaceB::namespaceC::namespaceD::namespaceE::tada(c); 
    } 
    //... 
}; 

foo::foo(int a, int b, int c) : a(a), b(b), c(tada_again(c)) 
{ 
} 

Wenn es nicht viele Ebenen der Namensräume sind, müssen eingegeben werden, aus pflegen oder die Lesbarkeit des Codes Sicht , halte den Namespace sauber.

+0

Das bietet die Kürze innerhalb des Konstruktors, bietet jedoch keine Koenig-Suche. Man könnte eine 'using namespaceA :: namespaceB :: etc; -Zeile über dem' tada (c) '-Bit hinzufügen, um zu erreichen, wonach ich suche. Vielen Dank. –

3

Würde ein Namespace-Alias ​​helfen?

using SVLI = something::very::long::indeed; 

foo::foo(int a, int b, int c) : a(a), b(b), c(SVLI::tada(c)) {} 
+0

Das übertrifft meine Längenbeschwerde, sagen wir, wenn ich 'SVLI' wiederholt innerhalb eines hypothetischen' c1', 'c2',' c3' verwende, ganz wie 'c' oben, aber es liefert keine Koenig-Suche. –

Verwandte Themen