C++ Lambda 包装器:应该更喜欢捕获或通过参数
C++ Lambda Wrapper: Should one prefer to have arguments captured or passed?
我正在围绕一些代码编写一个包装函数,以最大限度地提高其重用率。它看起来像下面这样:
template <class Func>
void do_work(const int *R, Func extra_work)
{
//do some work
int i = ...
int j = ...
extra_work(i,j); //Using extra_lamb_1
//extra_work(i,j,R); //Using extra_lamb_2
}
包装器如下所示:
void work_wrapper(const int *R, int *Q)
{
auto extra_lamb_1 = [R,Q] (int i, int j) //Captures R
{
//Do extra stuff
};
/*auto extra_lamb_2 = [Q] (int i, int j, int *R) //Passes R
{
//Do extra stuff
};*/
do_work(R,extra_lamb_1);
//do_work(R,extra_lamb_2);
}
我的问题是,在这种情况下,extra_lamb_1
是比extra_lamb_2
更可取还是反之亦然?为什么?
如前所述,R
没有功能差异,因为它已经在do_work
中可访问。
对于Q
来说会有区别,因为它不在do_work
的范围内。
如果R
是do_work
运算的一个组成部分,那么它绝对应该作为一个参数传递。如果没有,那么捕获R
更有意义,这样它就不会弄乱do_work
的范围。
相关文章:
- 如果条件不相关,我应该更喜欢两个 if 语句而不是 if-else 语句吗?
- 为什么 C++ 程序员更喜欢前缀 ++,而 Java 程序员更喜欢后缀 ++?
- 在C++ Lambda 表达式中,为什么人们更喜欢按值捕获而不是作为参数传递?
- 如果可能的话,C++总是更喜欢右值引用转换运算符而不是常量左值引用吗?
- 为什么斯科特·迈耶斯(Scott Meyers)建议更喜欢"迭代器"而不是"const_i
- 在实现文件中,我们应该更喜欢"using namespace"指令还是将实现包装在命名空间 { } 中?
- 为什么 clang++ 更喜欢 adcx 而不是 adc
- 如何让编译器在C++中更喜欢常量方法重载?
- 为什么重载解析更喜欢不受约束的模板函数而不是更具体的模板函数?
- 使用LLVM在代码生成期间,更喜欢LLVM :: StringMap或STD :: MAP
- 我应该更喜欢在函数中的常数:constexpr const或enum
- 如何更喜欢由AddFontMemresourceex加载的字体而不是系统
- 明智的选择是更喜欢lambdas功能对象
- 有什么理由更喜欢从 IDE 中运行应用程序而不是运行独立的可执行文件?
- 为什么使用Mesos代码比遗产更喜欢模板
- Curly Braces构造函数更喜欢initializer_list而不是更好的匹配.为什么
- 非常量指针更喜欢常量 T&重载而不是常量 T*
- TensorFlow用户应该更喜欢SavedModel而不是Checkpoint或GraphDef吗?
- 为什么相对于右值引用参数,右值引用自变量更喜欢常量左值引用
- C++ Lambda 包装器:应该更喜欢捕获或通过参数