gpt4 book ai didi

c++ - 调用函数对象时如何保证参数评估的顺序?

转载 作者:IT老高 更新时间:2023-10-28 22:03:51 27 4
gpt4 key购买 nike

how to avoid undefined execution order for the constructors when using std::make_tuple 上问题的答案引发了一次讨论,在讨论中我了解到可以保证构造函数的参数评估顺序:使用 braced-init-list 可以保证从左到右的顺序:

T{ a, b, c }

表达式 abc 按给定顺序计算。情况就是这样,即使类型 T 只是定义了一个普通的构造函数。

显然,并非所有被调用的东西都是构造函数,有时在调用函数时保证评估顺序会很好,但没有像 brace-argument-list 这样的东西来调用函数对他们的论点进行定义的评估顺序。问题变成了:对构造函数的保证是否可以用于构建一个函数调用工具(“function_apply()”),并为参数的评估提供排序保证?要求调用函数对象是可以接受的。

最佳答案

像这样一个愚蠢的包装类呢:

struct OrderedCall
{
template <typename F, typename ...Args>
OrderedCall(F && f, Args &&... args)
{
std::forward<F>(f)(std::forward<Args>(args)...);
}
};

用法:

void foo(int, char, bool);

OrderedCall{foo, 5, 'x', false};

如果你想要一个返回值,你可以通过引用传递它(你需要一些特征来提取返回类型),或者将它存储在对象中,以获得如下接口(interface):

auto x = OrderedCall{foo, 5, 'x', false}.get_result();

关于c++ - 调用函数对象时如何保证参数评估的顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14058592/

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