ペアを 2 つのローカル変数にアンパックするマクロを作成したいと思います。ペアが単なる変数である場合は、ペアのコピーを作成したくありません。これにより、次のことが実現します。
#define UNPACK_PAIR(V1, V2, PAIR) \
auto& V1 = PAIR.first; \
auto& V2 = PAIR.second;
UNPACK_PAIR(one, two, x);
ただし、複数回指定された式を評価しないようにしたいと思います。たとえば、これはexpensive_computation()
1 回だけ呼び出す必要があります。
UNPACK_PAIR(one, two, expensive_computation());
私が行った場合:
#define UNPACK_PAIR_A(V1, V2, PAIR) \
auto tmp = PAIR; \
auto& V1 = tmp.first; \
auto& V2 = tmp.second;
その後、ケースで機能しexpensive_computation()
ますが、ケースでコピーを作成しますx
。私が行った場合:
#define UNPACK_PAIR_R(V1, V2, PAIR) \
auto& tmp = PAIR; \
auto& V1 = tmp.first; \
auto& V2 = tmp.second;
次にx
、コピーを作成せずにケースで動作しますが、ケースで失敗しますexpensive_computation()
。私が行った場合:
#define UNPACK_PAIR_CR(V1, V2, PAIR) \
const auto& tmp = PAIR; \
auto& V1 = tmp.first; \
auto& V2 = tmp.second;
#define UNPACK_PAIR_RR(V1, V2, PAIR) \
auto&& tmp = PAIR; \
auto& V1 = tmp.first; \
auto& V2 = tmp.second;
これらは両方ともコンパイルして実行しますが、未定義の動作を引き起こすと思われます-それについては正しいですか? また、これらのいずれかは意味がありますか?
#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;
これらのユース ケースの両方で機能するマクロを作成する方法はありx
ますか?