2012-08-03 147 views
1

我有一個遞歸可變參數模板的方法是從非遞歸可變參數模板方法調用(可能不相關,但我會提到它,以防萬一):可變參數模板和sizeof ...()混淆

template < class T, class UnaryPredicate, typename... UnaryPredicates > 
static bool checkPredicate(const T obj, 
          const UnaryPredicate& p, 
          UnaryPredicates... predicates) 
{ 
    bool output = p(obj); 
    if (output && sizeof...(UnaryPredicates)) { 
     output = checkPredicate(obj, predicates...); // The problem line. 
    } 

    return output; 
} 

然而,當一個名爲:

.. = checkPredicate< Sy_simObject*, VisiblePredicate< Sy_simObject* >(..); 

它給了我下面的錯誤:

error: no matching function for call to 'Sy_project::checkPredicate(Sy_simObject* const&)'

我取消明確說明錯誤告訴我UnaryPredicates是空的,並且只有T沒有超載,並且確實如果我把它編譯好。但我不知道它如何能夠在sizeof...(UnaryPredicates)檢查有條件嗎?當然,如果沒有更多,它會被評估爲假,遞歸會結束?

我可以通過添加重載來修復它,我真的很想理解它爲什麼現在不起作用。

+1

[靜態如果我有一個錘子](http://ecn.channel9.msdn.com/events/GoingNative12/GN12StaticIfIHadAHammer.pdf)...! – mavam 2012-08-03 19:14:26

回答

4

因爲if(cond) { body }運行時間,如果。事實上,編譯器可以在編譯時事先知道它不需要在運行時進行分支,這可以用來優化生成的代碼,但它不會影響它是否抱怨代碼的某些部分。

如果body的代碼是無效的,如果condfalse,編譯器會發出抱怨。你正在尋找的是一個靜態如果,它控制你的代碼的某些部分是否由編譯器處理。對於下一個C++版本有這樣的建議,但目前的C++沒有這樣的結構。

+0

預處理器條件是一種「靜態if」。但與提問者更相關的可能是SFINAE。 – jxh 2012-08-03 19:01:59

+1

靜態如果與預處理器條件有所不同。它會使許多(ab)使用「sfinae」不推薦使用。據我瞭解,@ cbamber85已經知道如何修復他的代碼。這裏不需要SFINAE。正如他所說的,一個更專業的寫得好的超載是他所需要的。 – 2012-08-03 19:07:23

+0

@ JohannesSchaub-litb你是對的,現在你已經指出它是非常明顯的!即使我確實可以訪問一個* static if *,它仍然沒有幫助,因爲'output'只是運行時評估,所以條件作爲一個整體變爲運行時。 – cmannett85 2012-08-03 19:30:09