boost :: bind и << оператор в C ++ - PullRequest
5 голосов
/ 07 мая 2010

Я бы хотел привязать оператор << потока: </p>

for_each(begin, end, boost::bind(&operator<<, stream, _1));

К сожалению, это не работает:

Error   1   error C2780: 'boost::_bi::bind_t<_bi::dm_result<MT::* ,A1>::type,boost::_mfi::dm<M,T>,_bi::list_av_1<A1>::type> boost::bind(M T::* ,A1)' : expects 2 arguments - 3 provided c:\source\repository\repository\positions.cpp   90

Что я делаю не так?

Ответы [ 2 ]

8 голосов
/ 07 мая 2010

Вместо этого вы можете попробовать boost.lambda:

//using namespace boost::lambda;
for_each(begin, end, stream << _1));

Причина вашей проблемы, скорее всего, такова: как вы можете ожидать, что компилятор / bind будет знать, какой адрес вы берете, если выскажи &operator<<?(Я получаю другую ошибку, просто говоря, что это не объявлено.)


Если вы действительно хотите сделать это с помощью bind, вам нужно будет указать, какой operator<< вы хотите использовать,например, предполагая int (вам также необходимо знать, перегружен ли оператор как член или свободная функция):

bind(static_cast<std::ostream& (std::ostream::*)(int)>(&std::ostream::operator<<), ref(std::cout), _1)
5 голосов
/ 07 мая 2010

Возможно, вы можете использовать ostream_iterator вместо:

vector<int> V;
// ...
copy(V.begin(), V.end(), ostream_iterator<int>(cout, "\n"));
...