Вкратце и очень иллюстративно так:
Почему не получается использовать такой код:
int main(int argc, char **argv)
{
list< string > strings;
strings.push_back("hello"); strings.push_back("world"); strings.push_back("from"); strings.push_back("zealot");
struct wordPrinter { void operator ()(const string& word) { cout << word.c_str() << "\t"; } }; for_each(strings.begin(), strings.end(), wordPrinter());
return 0;
}
а вот если описание структуры — предиката вынести из функции — запросто
struct wordPrinter { void operator ()(const string& word) { cout << word.c_str() << "\t"; } };
int main(int argc, char **argv)
{
list< string > strings;
strings.push_back("hello"); strings.push_back("world"); strings.push_back("from"); strings.push_back("zealot");
for_each(strings.begin(), strings.end(), wordPrinter());
return 0;
}
и просто структуры или объединения с битовыми полями прямо в функции объявляю — всё в порядке
я в недоумении
Здравствуйте, takoReinolds, Вы писали:
R>Почему не получается использовать такой код:
Шаблон не может параметризоваться локальным типом. АФАИК, это пофикшено в C++0x.
Можно вот так, тут шаблон не параметризуется локальным типом:
void foo()
{
struct local { static void pred(...)
{
...
}};
for_each(..., &local::pred);
}
Здравствуйте, remark, Вы писали:
R>Можно вот так, тут шаблон не параметризуется локальным типом:
Ибо, хотя объект и локальный (адрес функции local::pred), но её тип — которым, собственно, параметризовали шаблон, — вполне глобальный: void(...)
Но такой манёвр может привести к нарушению ODR

волею компилятора.
Не дай бог, где-то ещё в другом файле встретится функция foo, содержащая класс local с методом pred.
Во всяком случае, VC8 и VC9 говорят о множественном определении. А gcc сходит с нарезки на чуть более сложном примере.
Здравствуйте, takoReinolds, Вы писали:
R>Вкратце и очень иллюстративно так:
R>Почему не получается использовать такой код:
R>и просто структуры или объединения с битовыми полями прямо в функции объявляю — всё в порядке
R>я в недоумении
в таких случаях я предпочитаю макрос.
#define range_for_each(IteratorType, RangeBegin, RangeEnd, IteratorName) \
for (IteratorType IteratorName = RangeBegin; IteratorName != RangeEnd; ++IteratorName)
int main(int argc, char **argv)
{
list< string > strings;
strings.push_back("hello"); strings.push_back("world"); strings.push_back("from"); strings.push_back("zealot");
range_for_each(list<string>::const_iterator, strings.begin(), strings.end(), word)
{
cout << word->c_str() << "\t";
}
return 0;
}