Workaround für die Umkehrung der argumentabhängigen Suche?

8

C ++ hat ADL (Argument Dependent Lookup), durch das, wie sein Name beschreibt, der Kontext (Namespace) einer Funktion aus dem Kontext (Namespace) von (irgendeinem) Argument (en) impliziert werden kann.

%Vor%

Meine Frage ist, ob das Umgekehrte auch durch eine Technik möglich ist? Mit reverse meine ich, wenn der Kontext (Namespace) aus dem Kontext der aufgerufenen Funktion abgeleitet werden kann. Eine Art von "Function Dependent Lookup" (FDL). Gefälschter Code:

%Vor%

Ich kann mir nicht vorstellen, wie ich das machen soll. Diese Einschränkung ist besonders ärgerlich für enum s, die zum Codieren von Funktionen verwendet wird. Ich würde gerne wissen, ob es eine Technik gibt, um diese Funktion zu simulieren (C ++ 11 wäre auch in Ordnung). Gefälschter Code:

%Vor%

Insbesondere, wenn es eine Problemumgehung für enum s gibt.

Dieser Code veranschaulicht das Problem:

%Vor%

BEARBEITEN: @jrok hat eine Problemumgehung basierend auf der Definition von geschachteltem Namespace vorgeschlagen. Für den Fall enum bekomme ich diesen Code. Das hat immer noch etwas Rauschen (es gibt überhaupt keine "abhängige" Suche), aber es ist eine Verbesserung.

%Vor%

Ich benutze enum class nicht, weil dann Saturday , Sunday usw. nicht direkt im scope angezeigt werden können (in der Tat würde using longname::days::_ mir einen Kompilierfehler geben)

    
alfC 15.12.2013, 22:04
quelle

1 Antwort

2

Ja und nein. Meist nicht.

Die schlechte Nachricht ist, dass eine Enumeration außerhalb des aktuellen Bereichs wie Tuesday usw. nicht an eine Funktion übergeben werden kann, selbst wenn diese Funktion in einem Namespace deklariert wurde, in dem die Enumeration sichtbar war. Dies liegt daran, dass die Argumentsuche zuerst erfolgt, wenn Sie einen Funktionsaufruf schreiben, und die Argumente nicht an gun übergeben werden können und dann eine Namenssuche erfolgt. Nichts kann das ändern - aber es gibt auch gute Nachrichten.

Zuerst scheinen Sie Verhalten zu brauchen, das ns::foo(arg1, arg2) - & gt; %Code%. Funktionsaufrufe und Templates können dies nicht ändern, aber Makros können und ich enthalten und Beispiel.

Ich habe auch ein einfaches Beispiel für argumentabhängiges Nachschlagen gegeben. Sie können sehen, dass die Out-of-Scope-Funktionen GetMonday und GetTuesday (die Ihre Out-of-Scope-Enum ausgeben) mithilfe dieses Mechanismus gefunden werden können, weil Sie einen Typ aus diesem Namespace aufgenommen haben. {using namespace ns; ns::foo(arg1, arg2);} fügt dem Bereich den versteckten Namespace hinzu, wenn der Compiler versucht, GetMonday zu finden, und GetMonday gibt RegisterNamespace::val zurück, wodurch der Compiler Days finden kann.

Sie möchten wirklich, dass der Compiler den Bereich ändert, indem er zusätzliche Namespaces hinzufügt, wenn er auf eine Funktion aus einem anderen Namespace trifft. Allerdings hat der Compiler die Typen der Argumente bereits bestimmt und benötigt sie, um andere mögliche Alternativen zu der Funktion zu finden.

%Vor%     
user3125280 23.12.2013, 16:26
quelle