Gibt es eine Möglichkeit portabel zu erkennen, dass ein Standard-Header mit Makros eingebunden ist?

8

Ich möchte ein Äquivalent zu boost::swap machen, und in meiner Umgebung können Standard-Header enthalten sein oder nicht. Abhängig von der Projektlizenzierung und anderen Sachen.
Ich möchte Teile des Codes durch Wachdetektoren schützen lassen:

Betrachten wir eine Kompilierungseinheit.
projektspezifisches, vorher geschriebenes Potenzial beinhaltet:

%Vor%

später im Projektcode, der von meinem Swap-Dienstprogramm-Header enthalten ist:

%Vor%

Ich habe es vereinfacht, weil wir hier nicht über Einzelheiten des ADL-Tricks sprechen, aber es wird mit einbezogen.
hier für die Referenz dessen, worüber ich spreche, aber das ist für diese Frage irrelevant:
Ссылка

In dieser Frage geht es darum, wie ich die standardmäßige Header-Inklusion erkennen kann ? Der _ALGORITHM_ -Wächter ist im Visual Studio-Header vorhanden, aber ich habe nirgendwo auf Ссылка gelesen, dass er ein Makro haben sollte das kann ich überprüfen.

( letzte Anmerkung : Diese Frage ist ein wenig XY-voreingenommen. Was ich wirklich will, ist das Vorhandensein der Funktion std::swap , nicht die Kopfzeile, zu erkennen.)

    
v.oddou 04.03.2015, 02:24
quelle

1 Antwort

4

Eine Option, mit der Sie Ihre Überladung zu einem "schlechteren Match" machen können als die Alternativen. Nur dann, wenn sie nicht bereits vorhanden sind, wird Ihre Version ausgewählt:

%Vor%

Was passiert:

Wenn es zwei Kandidatenfunktionsspezialisierungen gibt, führt der Compiler "Partielle Ordnung der Funktionsvorlagen" ('03 14.5.5.2) aus. Dies überprüft, ob die Funktionsschablonenparameter der einen Vorlage zur Spezialisierung der anderen verwendet werden können.

Für jede Vorlage werden die Dummy-Parameter T1 und T2 verwendet und wir erstellen Dummy-Argumentlisten mit folgenden Typen:

%Vor%

Wenn Sie unseren Swap mit den Dummy-Argumenten von std::swap spezialisieren, erhalten Sie:

%Vor%

Das abgeleitete T ist T1 und der Abzug ist erfolgreich.

Die Spezialisierung std::swap unter Verwendung der Dummy-Argumente für unseren Austausch ergibt:

%Vor%

Die abgeleiteten Typen für T sind nicht identisch und daher wird dies als Fehlschlag betrachtet.

Daher können die synthetisierten Argumente von std::swap verwendet werden, um unsere Vorlage zu spezialisieren, aber die synthetisierten Argumente unserer Vorlage können nicht zur Spezialisierung von std::swap verwendet werden. std::swap wird als spezialisierter angesehen und gewinnt so die Teilbestellung.

    
Richard Corden 04.03.2015, 13:15
quelle

Tags und Links