我們在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是如何通過元程式将工作由運作期移往編譯期的,也由此得以實作早期錯誤偵測和更高的執行效率。