【发布时间】:2010-07-07 20:28:34
【问题描述】:
首先是代码:
template<typename Func, typename Func2>
void ForEachField(Func normalHandler, Func2 arrayHandler = NULL, bool skipUnknowns = true)
{
for(int i = 0; i < mFields.size(); ++i)
{
Field *f = mFields[i];
if(skipUnknowns && f->IsUnknown())
continue;
if(f->GetCount() == 1 || !arrayHandler)
normalHandler(f);
else
arrayHandler(f);
}
}
还有一个用法示例:
df->ForEachField(
[&](Field *field) { f << "\t" << format("public $%s;\n") % field->GetName(); },
[&](Field *field) { f << "\t" << format("public $%s;\n") % field->GetName() % field->GetSize(); }
); // Works
df->ForEachField(
[&](Field *field) { WriteLine(f, format("\t\t'%s' => array('type' => '%s'),") % field->GetName() % field->GetTypeInfo()->Name);
}); // Doesn't work
第二次调用不起作用,因为它说:
OutputPhp.cpp(27): 错误 C2783: 'void 数据文件::ForEachField(Func,Func2,bool)' : 无法推断模板参数 对于 'Func2' 参见“DataFile::ForEachField”的声明
有什么方法可以让第二个参数成为可选参数,同时仍然使用模板,而不必手动指定第二个模板参数?
【问题讨论】:
标签: c++ templates lambda c++11