Объявление предиката в коде использующего метода
От: takoReinolds  
Дата: 18.01.10 13:53
Оценка:
Вкратце и очень иллюстративно так:

Почему не получается использовать такой код:

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;
}


и просто структуры или объединения с битовыми полями прямо в функции объявляю — всё в порядке
я в недоумении
Re: Объявление предиката в коде использующего метода
От: remark Россия http://www.1024cores.net/
Дата: 18.01.10 14:13
Оценка: +1
Здравствуйте, takoReinolds, Вы писали:

R>Почему не получается использовать такой код:


Шаблон не может параметризоваться локальным типом. АФАИК, это пофикшено в C++0x.

Можно вот так, тут шаблон не параметризуется локальным типом:
void foo()
{
  struct local { static void pred(...)
  {
    ...
  }};
  for_each(..., &local::pred);
}




1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: Объявление предиката в коде использующего метода
От: takoReinolds  
Дата: 18.01.10 14:18
Оценка:
Большое спасибо
Re[2]: Объявление предиката в коде использующего метода
От: Кодт Россия  
Дата: 18.01.10 14:51
Оценка:
Здравствуйте, remark, Вы писали:

R>Можно вот так, тут шаблон не параметризуется локальным типом:


Ибо, хотя объект и локальный (адрес функции local::pred), но её тип — которым, собственно, параметризовали шаблон, — вполне глобальный: void(...)

Но такой манёвр может привести к нарушению ODR волею компилятора.
Не дай бог, где-то ещё в другом файле встретится функция foo, содержащая класс local с методом pred.

Во всяком случае, VC8 и VC9 говорят о множественном определении. А gcc сходит с нарезки на чуть более сложном примере.
Перекуём баги на фичи!
Re: Объявление предиката в коде использующего метода
От: Caracrist https://1pwd.org/
Дата: 19.01.10 08:12
Оценка:
Здравствуйте, 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;
}

~~~~~
~lol~~
~~~ Single Password Solution
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.