LINUX.ORG.RU

[C++,std::istream::operator >>] Специализация для вывода в функцию


0

1

В документации по std::istream есть такая специализация этого istream:

istream& operator>> (istream& ( *pf )(istream&));

Но при попытке вывести поток в указатель на функцию с такой сигнатурой конпелятор ошибается и ругается. ЧЯДНТ? Правильно ли я вообще понимаю эту специализацию для operator >> ?

Так, с чистой функцией, вроде, получилось, теперь с operator >> не срастается boost::bind и функция с несколькими параметрами, из которых только std::istream& не связан, что-то вроде

std::istream& check_sensor(std::istream& is,int& int_)
{
//...
return is;
}

int int_=100500;
std::string string_;
//...
std::istringstream iss_(string_);
iss_ >> std::skipws >> boost::bind(check_sensor,_1,int_)

Что здесь неправильно может быть?

one_more_hokum ★★★
() автор топика

Дык в прототипе написана явно функция. Если хочешь, чтобы можно было передавать что-попало-вызываемое, надо объявлять шаблон. Сравни с прототипом какого-нибудь алгоритма, принимающего предикат.

const86 ★★★★★
()
Ответ на: комментарий от const86

надо объявлять шаблон

Объявлять шаблон чего именно? И почему шаблон? Не специализацию-ли свою создавать надо этого operator >> ?

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от one_more_hokum

> Объявлять шаблон чего именно?

Либо шаблонный метод в классе istream, что простой смертный программист делать не может, либо шаблонный свободный operator >>.

const86 ★★★★★
()
Ответ на: комментарий от const86

либо шаблонный свободный operator >>

Это по аналогии с

template <class charT, class traits>
  basic_istream<charT,traits>& operator>> (basic_istream<charT,traits>& is, charT& ch );

?

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от one_more_hokum
#include <functional>
#include <iostream>

template<typename F>
static std::istream &operator >>(std::istream &is, F f)
{
    return f(is);
}

static std::istream &f(std::istream &is, int x)
{
    std::clog << __func__ << ' ' << x << std::endl;
    return is;
}

int main()
{
    std::cin >> std::bind(f, std::placeholders::_1, 4);
}
const86 ★★★★★
()
Ответ на: комментарий от one_more_hokum

> А когда уже успели в std:: положить placeholders ?

Это из C++0x. Календарь намекает, что юзать уже можно :) Ну, под буст перепишешь, надеюсь.

const86 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.