Чему-то нравится, могли бы запустить Вас, возможно:
TCHAR moduleName[MAX_PATH+1];
(void)GetModuleFileName(AfxGetInstanceHandle(), moduleName, MAX_PATH);
DWORD dummyZero;
DWORD versionSize = GetFileVersionInfoSize(moduleName, &dummyZero);
if(versionSize == 0)
{
return NULL;
}
void* pVersion = malloc(versionSize);
if(pVersion == NULL)
{
return NULL;
}
if(!GetFileVersionInfo(moduleName, NULL, versionSize, pVersion))
{
free(pVersion);
return NULL;
}
UINT length;
VS_FIXEDFILEINFO* pFixInfo;
VERIFY(VerQueryValue(pVersionInfo, const_cast<LPTSTR>("\\"), (LPVOID*)&pFixInfo, &length));
Любой итератор должен предоставлять iterator_traits
. Если нет, значит, это не итератор. ISO C ++ 2003 24.3.1 [lib.iterator.traits] «Свойства итератора»:
Для реализации алгоритмов только в терминах итераторов часто бывает необходимо определить ценность и разницу типы, которые соответствуют определенному тип итератора. Соответственно, это требуется, чтобы если
Итератор
был типом итератора типыiterator_traits
:: difference_type iterator_traits :: value_type iterator_traits :: iterator_category можно определить как итератор тип различия, тип значения и категория итератора, соответственно.
Помимо этого, не существует общего способа получить тип произвольного выражения C ++. C ++ 0x исправит это, предоставив decltype
.
As to getting value type of iterator previous answers were correct.
But there is more. The trick you are thinking of would not work with class. If Bar
was a function like:
template <typename Iterator, typename Value>
void bar(const Iterator& dummy_iterator, const Value& dummmy_value) {}
then type deduction would work for bar(it, *it)
and you would have the value type inside of bar
. (But keep in mind that to use this trick you would still have to have a dereferencable iterator it which is not always good - how to deal with empty sequence then?)
Using a class Bar
you would have to provide the template arguments Iterator
and Value
manually as there is no type deduction for classes and using Bar(it, *it)
would no compile.
Извините. Правильный способ избавиться от Value
- использовать iterator_traits
, как вы предложили.
Если ваш итератор, не относящийся к STL, является голым указателем, то вы получите правильные определения типов iterator_traits бесплатно . В противном случае класс итератора, не относящийся к STL, должен определять правильные определения типов.
Дополнительную информацию см. В документации по свойствам итератора .