我对C ++的答案最感兴趣,但此外C答案也会受到欢迎,因为它们可能会有所不同。这是真实代码的简化版本,专注于我的问题,所以假设我所写的是正确的:P
想象一下,我在库中有一个名为process
的函数
此功能有三个参数, a , b 和 c
大多数情况下,该函数只需要 a 和 b 的值来完成它的工作,但在某些情况下需要 c 。
现在我想从主程序中调用它
process(1, 2, very_expensive_call(55, 67, "Hello"));
想象一下, c 的值计算起来非常昂贵。因为它可能不需要,除非必须,否则我不想计算它。
我不希望我的主程序必须重复知道是否需要 c 的逻辑。我不希望图书馆了解very_expensive_call
。
那么如何组织我的代码以防止调用昂贵的功能,同时保持高效和优雅?
答案 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
以获取计算值。