如何创建一个多次使用某个值而不复制它的宏?

2023-11-22

我想创建一个宏,将一对解包为两个局部变量。如果它只是一个变量,我不想创建该对的副本,这将完成:

#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但在给出表达式或函数调用的结果时也不调用未定义的行为?


您不需要为此使用宏。

auto p = std::make_pair(2, 3);
int x, y;
std::tie(x, y) = p;

如果您想要引用一对现有成员:

auto p = std::make_pair(2, 3);
auto& x = p.first;
auto& y = p.second;

就是这样。

现在你可以继续做一些更具挑战性/有趣/重要的事情。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何创建一个多次使用某个值而不复制它的宏? 的相关文章

随机推荐