Здравствуйте, 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) );