Re[3]: Как скопировать объекты из класса?
От: Кодт Россия  
Дата: 19.07.10 14:19
Оценка:
Здравствуйте, Wody, Вы писали:

W>Спасибо, приятное решение. А как поступить если для X используется подход с разделением на интерфейс (абстрактный класс) и имплементацию?


Паттерн "Посетитель".

Заменить output iterator на функцию, например
class IX
{
  .....
  virtual void copyTo( boost::function<void(int)> output ) = 0;
};

......

void X::copyTo( boost::function<void(int)> output )
{
  std::for_each( c.begin(), c.end(), boost::bind(output, boost::bind(getTheField, _1)) );
  // или просто
  for(container::const_iterator i=c.begin(); i!=c.end(); ++i)
    output(i->second->theField);
}

А саму функцию несложно сконструировать из итератора
struct writer // всеядная функция - мономорфный тип с полиморфным оператором
{
  typedef void result_type;
  template<class I, class V> void operator()(I& i, V const& v) { *i++ = v; }
};

std::vector<long> vec; // заметим, что тип приёмника (long) не обязательно совпадает с типом источника (int)
x.copyTo( boost::bind(writer(), std::back_inserter(vec), _1) );
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.