天天看點

Item 48: 認識template元程式設計

我們在Item 47留下了一個問題,現在再來看一看:

template<typename IterT, typename DistT>
void advance( IterT& iter, DistT d ){
  if( typeid(typename std::iterator_traits<IterT>::iterator_category)
      == typeid(std::random_access_iterator_tag)){
    iter += d;
  }
  else
    ...
}
           

假如有下面的語句

std::list<int>::iterator iter;
...
advance( iter,  );    //iter是bidirectional_iterator
           

我們知道,iter+=d總是不會被執行到,但是編譯器看到了,它要求所有的源碼都必須有效,即使是不會執行起來的代碼。是以,編譯不通過。 

traits class,或者應該說,template程式設計真是一件神奇的事情。

至于元程式設計,隻覺得它非常奇妙。就像前面的advance一樣,也是元程式設計的一種。我們已經看到,advance是如何通過元程式将工作由運作期移往編譯期的,也由此得以實作早期錯誤偵測和更高的執行效率。

繼續閱讀