gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:01:38 25 4
gpt4 key购买 nike

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

#define UNPACK_PAIR(V1, V2, PAIR) \
auto& V1 = PAIR.first; \
auto& V2 = PAIR.second;

UNPACK_PAIR(one, two, x);

但是,我也希望它不要多次计算它给出的表达式,例如这应该只调用 expensive_computation() 一次:

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

最佳答案

你不需要宏。

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;

就是这样。

现在您可以继续进行更具挑战性/有趣/重要的事情。

关于c++ - 如何创建一个多次使用一个值而不复制它的宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31272705/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com