Действительно ли возможно получить тип значения от произвольного итератора (C++)?

Чему-то нравится, могли бы запустить Вас, возможно:

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));
14
задан Igor Krivokon 10 July 2009 в 01:10
поделиться

3 ответа

Любой итератор должен предоставлять iterator_traits :: value_type . Если нет, значит, это не итератор. 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 .

18
ответ дан 1 December 2019 в 13:09
поделиться

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.

1
ответ дан 1 December 2019 в 13:09
поделиться

Извините. Правильный способ избавиться от Value - использовать iterator_traits , как вы предложили.

Если ваш итератор, не относящийся к STL, является голым указателем, то вы получите правильные определения типов iterator_traits бесплатно . В противном случае класс итератора, не относящийся к STL, должен определять правильные определения типов.

Дополнительную информацию см. В документации по свойствам итератора .

1
ответ дан 1 December 2019 в 13:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: