Компилятор не может вывести аргументы шаблона, потому что подгонка к параметрам будет означать нетривиальное преобразование - сначала в Iterator<T>
, а затем в Ref<Iterator<T> >
, которые оба требуют пользовательских преобразований. Кроме того, прямое преобразование указателя на функцию-член в boost :: function аналогично нетривиально для компилятора.
IBM имеет список поддерживаемых вычетов параметров шаблона .
Если вы хотите, чтобы аргументы вашего шаблона выводились автоматически, вы должны предоставить методы-оболочки:
template <typename T>
Ref<Iterator<T> > makeIteratorRef(T val) {
return Ref<Iterator<T> >(Iterator<T>(val));
}
template <typename T>
boost::function<bool (T)> makeFn(bool (T::*fn) () const) {
boost::function<bool (T)> res = boost::bind(fn, _1);
return res;
}
...
Ref<Iterator<CWorm*> > x = GetFilterIterator(makeIteratorRef(worms()), makeFn(&CWorm::getLocal));
Таким образом, компилятор может определить параметры шаблона, потому что преобразование не требуется.
Кстати, я думаю, вы слишком усложняете простые вещи:
for (auto it = worms().begin(); it != worms().end(); ++it)
if (it->isLocal()) {
// Do something
}
Этот код более читабелен в C ++, и хотя он может быть не таким общим, он вряд ли ухудшит код.