2017-01-23 2 views
0

Ich mag überprüfen, ob ein vollständig qualifizierte Namen und ein unqualifizierten oder teilweise qualifizierte Namen auf das gleiche Symbol beziehen, auch wenn ein Name nicht definiert ist. Das heißt, ich möchte in der Lage sein, so etwas wie dies als Teil eines Refactoring-Tool zu schreiben:Wie können Sie prüfen, ob ein Name auf dasselbe Symbol wie ein anderes verweist?

namespace A { 
void f() {}; 
} 

namespace B { 
namespace A {}; 

    bool g() { 
    // returns false 
    return is_same_symbol<A::f, ::A::f>::value; 
    } 
} 

namespace C { 
    bool h() { 
    // returns true 
    return is_same_symbol<A::f, ::A::f>::value; 
    } 
} 
+1

"Ich würde gerne prüfen, ob zwei verschiedene Symbole sich auf dasselbe beziehen, auch wenn es keins gibt." Das macht wenig Sinn. –

+0

@NeilButterworth Ja, ich weiß, ich bin mir nicht sicher, wie ich es verbalisieren soll. Ich denke, eine bessere Art zu sagen ist: "Ich würde gerne prüfen, ob ein vollständig qualifizierter Name und ein unqualifizierter oder teilweise qualifizierter Name auf dasselbe Symbol verweisen." –

+2

Wenn ein Symbol nicht definiert ist und Sie versuchen, es zu verwenden, Sie erhalten einen Compiler-Fehler, schlicht und einfach. – AndyG

Antwort

0

Sie klären in einem Kommentar:

Ich versuche, die richtigen, um herauszufinden, SFINAE-Beschwörung, um zu überprüfen, ob eine freie Funktion eines bestimmten Namens existiert.

Sie können nicht.

Wenn Sie sagen eine freie Funktionfooexistiert, genannt, was meinst du damit?

Es hat eine der sein:

der Compiler eine Erklärung vonfoo gesehen hat:

... int foo(int i); 

oder:

der Compiler eine Definition vonfoo gesehen hat:

... int foo(int i) { 
    ... 
    return ...; 
} 

Eine Definition ist auch eine Erklärung, so dass, wenn der Compiler nicht eine Erklärung von foo gesehen hat, dann hat es keine Definition entweder gesehen.

Angenommen, Sie zu SFINAE-Sonde sind versuchen, ob foo deklariert wird. Wenn der Compiler, dass nicht einmal verwendet Sie eine Erklärung von foo dann jeder nachfolgenden Code schreiben gesehen hat foo als Name einen Compiler-Fehler in der Vene provozieren:

error: use of undeclared identifier 'foo' 

Sie Code schreiben können, nicht zu SFINAE-Probe, ob foo deklariert ist, weil Sie nicht C++ schreiben können, die nicht deklarierte Namen verwendet, Punkt.

Angenommen, Sie versuchen, SFINAE-Probe, ob foo ist definiert. , das zu tun, würden Sie zuerst Erklärung von foo haben müssen - entweder , die Sie selbst oder eine geschrieben haben, die Sie von einer Header-Datei haben.

Aber natürlich, da eine Erklärung von foo kann der Compiler nicht sagen, ob oder nicht definiert ist, und kümmert sich nicht darum, außer in den besonderen Fällen, dass die Funktion als static deklariert wird oder inline oder in einem anonymen Namespace. Sonst lässt es das Finden oder Nichtfinden einer Definition zum Linker.

Im Allgemeinen ist dann SFINAE-Prüfung der Existenz der Funktion Definitionen ist ebenfalls ein Non-Starter. Und selbst wenn foo ist static oder inline oder in einem anonymen Namespace deklariert, und es fehlt eine Definition innerhalb der Übersetzungseinheit, jeden Code, fooin Übereinstimmung mit der Erklärung verwendet bleibt wohlgeformter Code; Selbst in diesen Fällen bleibt die SFINAE-Prüfung für "is-it-defined" bedeutungslos.

Verwandte Themen