2017-07-30 7 views
0

ラムダ関数の戻り値によって定義される: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 */ } 

を書くことができますして

+1

std :: result_ofさんは動作しますか? – Brandon

答えて

0

しかし、私はコンストラクトのこの種は、あなたがSomeTypeのために特化できるテンプレート機能を使用してはるかに読みやすいと思う:

template<class X> 
void someFunction(const X& x) { /* standard case */ } 
template<> 
void someFunction(const SomeType& x) { /* SomeType case */ } 

と内部あなただけの呼び出しループ:

for(QDomElement el = list.item(i).firstChildElement(tag); 
       !el.isNull(); el = el.nextSiblingElement(tag)) 
    someFunction(action(el)); 
+0

いいえC++ 17しかし、文法ならそれを知りませんでした。しかし、これらのアダプタ機能をより簡単に見えるようにしてくれてありがとう。そして、より簡単なのは、あまり雄弁な同僚がコードを理解できるようにするためです。 – Swift

+0

'if constexpr'を確認してください:http://en.cppreference.com/w/cpp/language/if#Constexpr_If – chtz

関連する問題