我想创建一个宏,将一对解包为两个局部变量。如果它只是一个变量,我不想创建该对的副本,这将完成:
#define UNPACK_PAIR(V1, V2, PAIR) \
auto& V1 = PAIR.first; \
auto& V2 = PAIR.second;
UNPACK_PAIR(one, two, x);
但是,我也希望它不要评估多次给出的表达式,例如这应该只调用expensive_computation()
once:
UNPACK_PAIR(one, two, expensive_computation());
If I do:
#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
但在给出表达式或函数调用的结果时也不调用未定义的行为?