如何不总是计算可能未使用的参数值

时间:2016-10-26 15:48:52

标签: c++

我对C ++的答案最感兴趣,但此外C答案也会受到欢迎,因为它们可能会有所不同。这是真实代码的简化版本,专注于我的问题,所以假设我所写的是正确的:P

想象一下,我在库中有一个名为process的函数 此功能有三个参数, a b c
大多数情况下,该函数只需要 a b 的值来完成它的工作,但在某些情况下需要 c

现在我想从主程序中调用它 process(1, 2, very_expensive_call(55, 67, "Hello"));

想象一下, c 的值计算起来非常昂贵。因为它可能不需要,除非必须,否则我不想计算它。

我不希望我的主程序必须重复知道是否需要 c 的逻辑。我不希望图书馆了解very_expensive_call

那么如何组织我的代码以防止调用昂贵的功能,同时保持高效和优雅?

1 个答案:

答案 0 :(得分:2)

使它成为一个惰性调用,传递一个函数对象,该对象将根据请求计算值:

template<typename Expensive>
int process(int, int, Expensive&&);

然后你打电话:

process(1, 2, []{ return very_expensive_call(55, 67, "Hello"); });

如果您不想让您的功能成为模板,请使用std::function进行类型擦除(如果有适合您需要的替换,可以使用更轻的选项):

int process(int, int, function<expensive_result()>);

在呼叫站点没有变化:

process(1, 2, []{ return very_expensive_call(55, 67, "Hello"); });

此解决方案将要求您在()的代码中显式调用运算符process以获取计算值。