ラムダ関数の戻り値によって定義される:Tempateは、それがこのような行為の要件とテンプレートとする
template<typename MyActionLambda>
void enumerateChildrenByTag(QDomNodeList& list, const QString& tag, MyActionLambda action)
{
for(int i = 0; i < list.size(); i++) {
QDomElement el = list.item(i).firstChildElement(tag);
while(!el.isNull())
{
if(typeid(decltype(action(el))) == typeid(SomeType))
{
auto res = action(el)
// do something with res
}
else
// do something with action(el)
el = el.nextSiblingElement(tag);
}
}
}
これは明らかに両方のブランチので、それは無効戻り値の型を持っているラムダのために書かれた方法では不可能であろうif()は合法でなければなりません。テンプレートパラメータのデフォルト値としてdeclspecを作成し、2つのテンプレートを特殊化する以外は、これを解決する簡単な方法はありますか? C++ 17あなたは
if constexpr(std::is_same<decltype(action(el)),SomeType>::value)
auto res = action(el);
else
{ /* do something else */ }
を書くことができますして
std :: result_ofさんは動作しますか? – Brandon