我现在正在学习 C++,对 Lambda 函数的语法非常困惑
我想在单元顶部定义 lambda,例如
typedef const std::function<void (bool)> bitloop;
Run Code Online (Sandbox Code Playgroud)
或者
typedef void bitloop(bool bit, int idx);
Run Code Online (Sandbox Code Playgroud)
稍后,将 lambda 接受到类中的函数中,例如,在我的 Bits 类中,有一个 forEach 方法
void forEach(const bitloop loop){
for (int i = 0; i<=fCount-1;i++){
loop(this->isSet(i),i);
}
}
Run Code Online (Sandbox Code Playgroud)
然后最终能够稍后编写不同的循环函数,传递一个值和循环索引,以便我可以捕获本地范围内的变量,例如
bits.forEach([&](bool on, int i){
output("index" + to_string(count)); //count is locally declared variable
});
Run Code Online (Sandbox Code Playgroud)
如果我删除 &,它可以与第二种类型 def 一起正常工作,但是我无法捕获计数变量。
有人可以解释一下我的做法哪里出了问题,以及这是否是一种有效的方法?
我在Delphi(柏林)有很多记录结构,我试图通过RTTI递归迭代.代码不适用于内部记录.我在这做错了什么?
Procedure WriteFields(Const RType : TRttiType;
Const Test : TTestRecord;
Var Offset : integer);
var
RFields : TArray<TRTTIField>;
i : integer;
Val : TValue;
begin
RFields := GetFields(Rtype);
try
for i := Low(RFields) to High(RFields) do
begin
if RFields[i].FieldType.TypeKind <> tkRecord then
begin
Val := rfields[i].GetValue(@Test);
writeln(Format('Field Name: %s, Type: %s, Value: %s, Offset: %d',[
RFields[i].Name,
RFields[i].FieldType.ToString,
Val.ToString,
RFields[i].Offset]));
end
else
begin
WriteLn(Format('------- Inner record : %s',[RFields[i].name]));
//recursively call this routine for the other records, and fields
Writefields(RFields[i].FieldType,Test,Offset);
end;
Offset …Run Code Online (Sandbox Code Playgroud)