Ich möchte ein Makro erstellen, das ein Paar in zwei lokale Variablen entpackt. Ich möchte nicht eine Kopie des Paares erstellen, wenn es nur eine Variable ist, was würde dies erreichen:Wie kann ich ein Makro erstellen, das einen Wert mehrfach verwendet, ohne es zu kopieren?
#define UNPACK_PAIR(V1, V2, PAIR) \
auto& V1 = PAIR.first; \
auto& V2 = PAIR.second;
UNPACK_PAIR(one, two, x);
Allerdings würde Ich mag es auch nicht um den Ausdruck auszuwerten es mehrfach gegeben hat, z.B. dies sollte expensive_computation()
nur einmal nennen:
UNPACK_PAIR(one, two, expensive_computation());
Wenn ich tun:
#define UNPACK_PAIR_A(V1, V2, PAIR) \
auto tmp = PAIR; \
auto& V1 = tmp.first; \
auto& V2 = tmp.second;
dann funktioniert es für den expensive_computation()
Fall, aber es macht eine Kopie im x
Fall. Wenn ich das tue:
#define UNPACK_PAIR_R(V1, V2, PAIR) \
auto& tmp = PAIR; \
auto& V1 = tmp.first; \
auto& V2 = tmp.second;
Dann funktioniert es im x
Fall ohne eine Kopie zu machen, aber nicht in dem expensive_computation()
Fall. Wenn ich das tue:
Diese beiden kompilieren und ausführen, aber ich vermute, dass sie undefiniertes Verhalten aufrufen - bin ich das richtig? Würden beide davon einen Sinn ergeben?
#define UNPACK_PAIR_RR(V1, V2, PAIR) \
auto&& tmp = std::move(PAIR); \
auto& V1 = tmp.first; \
auto& V2 = tmp.second;
#define UNPACK_PAIR_RR(V1, V2, PAIR) \
auto&& tmp = std::forward<decltype(PAIR)>(PAIR); \
auto& V1 = tmp.first; \
auto& V2 = tmp.second;
Gibt es eine Möglichkeit, einen Makro zu erstellen, die für diese beiden Anwendungsfälle funktionieren - nicht x
Kopieren aber auch nicht undefiniertes Verhalten aufrufen, wenn das Ergebnis eines Ausdruck oder Funktionsaufruf gegeben?
* „? Diese beide kompilieren und ausführen, aber ich vermute, dass sie nicht definiertes Verhalten aufrufen - bin ich über die richtigen“ * Dieser von der Nutzung abhängt. Es ruft UB für so etwas auf wie 'auto id = [] (auto & & x) -> decltype (automatisch) {return decltype (x) (x); }; auto && tmp = id (5); ', aber es ruft UB nicht für' auto && tmp = 5; 'auf - dies hat etwas mit der Verlängerung der Lebenszeit von Provisorien zu tun, die an die Referenz gebunden sind. Müssen Sie ** den Wert "V" über Ihr Makro am Leben halten? 'auto tmp = V;' behält auch seinen Wert bei, es sei denn, es hat ein internes Lebensdauerproblem. – dyp
@dyp: Ja, ich möchte den Wert am Leben erhalten, ohne eine Kopie davon zu machen (was 'auto tmp = V' tun würde, wenn eine lokale Variable gegeben würde) – Claudiu
[This] (http://stackoverflow.com/questions/9431487/cc-define-macro-inside-macro) könnte relevant sein. –