Re: [Этюд] void f(T&) -> T f()
От: Caracrist https://1pwd.org/
Дата: 01.08.11 09:47
Оценка: 3 (2)
Здравствуйте, ankorol, Вы писали:

A>Как с помощью только стандартной библиотеки преобразовать функцию с аутпут параметром в функцию возвращающую значение, не создавая дополнительных функций и классов?



void f(T&);


T _tmp_; //дополнительные переменные вроде не запртили :)

T some_var; 
some_var = (f(_tmp_), _tmp_); // the magic :)
~~~~~
~lol~~
~~~ Single Password Solution
[Этюд] void f(T&) -> T f()
От: ankorol Украина  
Дата: 30.07.11 19:01
Оценка: -1
Как с помощью только стандартной библиотеки преобразовать функцию с аутпут параметром в функцию возвращающую значение, не создавая дополнительных функций и классов?
Re: [Этюд] void f(T&) -> T f()
От: Abyx Россия  
Дата: 30.07.11 19:25
Оценка:
Здравствуйте, ankorol, Вы писали:

A>Как с помощью только стандартной библиотеки преобразовать функцию с аутпут параметром в функцию возвращающую значение, не создавая дополнительных функций и классов?


всмысле нужен адаптер?

наверное только С++0х лямбдой
[]()->int { int x; foo(x); return x; }
In Zen We Trust
Re[2]: [Этюд] void f(T&) -> T f()
От: ankorol Украина  
Дата: 30.07.11 19:31
Оценка:
Здравствуйте, Abyx, Вы писали:

A>Здравствуйте, ankorol, Вы писали:


A>>Как с помощью только стандартной библиотеки преобразовать функцию с аутпут параметром в функцию возвращающую значение, не создавая дополнительных функций и классов?


A>всмысле нужен адаптер?


A>наверное только С++0х лямбдой

A>
A>[]()->int { int x; foo(x); return x; }
A>

Да, надо адаптер, но в текущем стандарте.
Re[2]: [Этюд] void f(T&) -> T f()
От: _nn_ www.nemerleweb.com
Дата: 31.07.11 06:54
Оценка:
Здравствуйте, Abyx, Вы писали:

A>Здравствуйте, ankorol, Вы писали:


A>>Как с помощью только стандартной библиотеки преобразовать функцию с аутпут параметром в функцию возвращающую значение, не создавая дополнительных функций и классов?


A>всмысле нужен адаптер?


A>наверное только С++0х лямбдой

A>
A>[]()->int { int x; foo(x); return x; }
A>


А разве лямбда не создаст дополнительную функцию или класс ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: [Этюд] void f(T&) -> T f()
От: ankorol Украина  
Дата: 01.08.11 10:31
Оценка:
Здравствуйте, Caracrist, Вы писали:

C>
C>T _tmp_; //дополнительные переменные вроде не запртили :)

C>T some_var; 
C>some_var = (f(_tmp_), _tmp_); // the magic :)
C>


Оригинальный подход, но всё таки (f(_tmp_), _tmp_) это не функция, в stl алгоритмы это не передаш
Re[3]: [Этюд] void f(T&) -> T f()
От: TheBeard Россия  
Дата: 01.08.11 11:45
Оценка:
C>>
C>>T _tmp_; //дополнительные переменные вроде не запртили :)

C>>T some_var; 
C>>some_var = (f(_tmp_), _tmp_); // the magic :)
C>>


A>Оригинальный подход, но всё таки (f(_tmp_), _tmp_) это не функция, в stl алгоритмы это не передаш


А какие алгоритмы, кроме generate, принимают функции без параметров?

Получается, вы хотите такого поведения:

// пусть f(x) такая:
void f(int& x)
{
  x = x + 42;
}
// делаем наивную обертку, которая удовлетворяет условию
int wrapper()
{
  int tmp;
  f(tmp);
  return tmp;
}

// и где-то потом ее применяем:

    std::vector<int> v(10, 0);
    std::generate(v.begin(), v.end(), wrapper)


Результат вас устроит?
Re[4]: [Этюд] void f(T&) -> T f()
От: ankorol Украина  
Дата: 01.08.11 11:56
Оценка:
Здравствуйте, TheBeard, Вы писали:

TB>Получается, вы хотите такого поведения:


TB>
TB>// пусть f(x) такая:
TB>void f(int& x)
TB>{
TB>  x = x + 42;
TB>}
TB>// делаем наивную обертку, которая удовлетворяет условию
TB>int wrapper()
TB>{
TB>  int tmp;
TB>  f(tmp);
TB>  return tmp;
TB>}

TB>// и где-то потом ее применяем:

TB>    std::vector<int> v(10, 0);
TB>    std::generate(v.begin(), v.end(), wrapper)
TB>


TB>Результат вас устроит?

Да, я хочу такого поведения, но без написания функции wrapper(). (Это чисто теоретическое изыскание)
Re[5]: [Этюд] void f(T&) -> T f()
От: TheBeard Россия  
Дата: 01.08.11 11:59
Оценка:
Здравствуйте, ankorol, Вы писали:

A>Здравствуйте, TheBeard, Вы писали:


TB>>Получается, вы хотите такого поведения:


TB>>
TB>>// пусть f(x) такая:
TB>>void f(int& x)
TB>>{
TB>>  x = x + 42;
TB>>}
TB>>// делаем наивную обертку, которая удовлетворяет условию
TB>>int wrapper()
TB>>{
TB>>  int tmp;
TB>>  f(tmp);
TB>>  return tmp;
TB>>}

TB>>// и где-то потом ее применяем:

TB>>    std::vector<int> v(10, 0);
TB>>    std::generate(v.begin(), v.end(), wrapper)
TB>>


TB>>Результат вас устроит?

A>Да, я хочу такого поведения, но без написания функции wrapper(). (Это чисто теоретическое изыскание)

То есть вы хотите неопределенного поведения.
Re[4]: [Этюд] void f(T&) -> T f()
От: ankorol Украина  
Дата: 01.08.11 12:01
Оценка:
Здравствуйте, TheBeard, Вы писали:

TB>
...
TB>// и где-то потом ее применяем:

TB>    std::vector<int> v(10, 0);
TB>    std::generate(v.begin(), v.end(), wrapper)
TB>


Вообще оригинальная задача: считать из входного потока какое-то наперёд заданное кол-во int-ов.
std::vector<int> x;
std::generate_n(back_inserter(x), NumberToRead, _что_то_(cin) );
Re[5]: [Этюд] void f(T&) -> T f()
От: TheBeard Россия  
Дата: 01.08.11 12:10
Оценка:
Здравствуйте, ankorol, Вы писали:

A>Вообще оригинальная задача: считать из входного потока какое-то наперёд заданное кол-во int-ов.

A>
A>std::vector<int> x;
A>std::generate_n(back_inserter(x), NumberToRead, _что_то_(cin) );
A>


ИМХО, Boost.Lambda поможет. Посмотрите, как там реализовано, только это может вас сильно огорчить.
Re[6]: [Этюд] void f(T&) -> T f()
От: ankorol Украина  
Дата: 01.08.11 12:14
Оценка:
Здравствуйте, TheBeard, Вы писали:

TB>То есть вы хотите неопределенного поведения.


Нет, хочу определенного, в функции void f(T& x), x — чисто аутпут параметр, а f какой-то генератор значений:

void f(int& x)
{
   cin >> x;
}

Тут ведь нет неопределенного поведения?
Re[6]: [Этюд] void f(T&) -> T f()
От: ankorol Украина  
Дата: 01.08.11 12:16
Оценка:
Здравствуйте, TheBeard, Вы писали:

TB>ИМХО, Boost.Lambda поможет. Посмотрите, как там реализовано, только это может вас сильно огорчить.


Смотрел. Там создается мильйон новых объектов...
Re[6]: [Этюд] void f(T&) -> T f()
От: TheBeard Россия  
Дата: 01.08.11 12:16
Оценка:
TB>ИМХО, Boost.Lambda поможет. Посмотрите, как там реализовано, только это может вас сильно огорчить.

То есть чушь написал, вам же хочется в рамках STL. И чтобы можно было передавать поток как параметр.

Тогда надо делать f не функцией, а функтором. В конструкторе передавать ссылку на поток, а чтение делать в перегруженном operator().
Re[7]: [Этюд] void f(T&) -> T f()
От: TheBeard Россия  
Дата: 01.08.11 12:19
Оценка:
A>
A>void f(int& x)
A>{
A>   cin >> x;
A>}
A>

A>Тут ведь нет неопределенного поведения?

А std::copy() в сочетании с input iterators не прокатит?
Re[7]: [Этюд] void f(T&) -> T f()
От: ankorol Украина  
Дата: 01.08.11 12:21
Оценка:
Здравствуйте, TheBeard, Вы писали:

TB>Тогда надо делать f не функцией, а функтором. В конструкторе передавать ссылку на поток, а чтение делать в перегруженном operator().


Все верно, мне всего лишь хотелось чтобы такой функтор уже был в STL...
Re[8]: [Этюд] void f(T&) -> T f()
От: ankorol Украина  
Дата: 01.08.11 12:24
Оценка:
Здравствуйте, TheBeard, Вы писали:


TB>А std::copy() в сочетании с input iterators не прокатит?


input iterator не произвольного доступа, тоесть я могу ограничить его каким-то кол-вом, а только концом ввода:

istream_iterator<int>(cin) + NumbersToRead; // ошибка: итератор не произвольного доступа
Re[9]: [Этюд] void f(T&) -> T f()
От: TheBeard Россия  
Дата: 01.08.11 12:32
Оценка:
Здравствуйте, ankorol, Вы писали:

A>Здравствуйте, TheBeard, Вы писали:



TB>>А std::copy() в сочетании с input iterators не прокатит?


A>input iterator не произвольного доступа, тоесть я могу ограничить его каким-то кол-вом, а только концом ввода:


A>
A>istream_iterator<int>(cin) + NumbersToRead; // ошибка: итератор не произвольного доступа
A>


Тогда std::copy_n()
Re[10]: [Этюд] void f(T&) -> T f()
От: ankorol Украина  
Дата: 01.08.11 12:42
Оценка:
Здравствуйте, TheBeard, Вы писали:

TB>Тогда std::copy_n()


copy_n() это уже С++0х вроде
Re[8]: [Этюд] void f(T&) -> T f()
От: _nn_ www.nemerleweb.com
Дата: 01.08.11 12:53
Оценка:
Здравствуйте, ankorol, Вы писали:

A>Здравствуйте, TheBeard, Вы писали:


TB>>Тогда надо делать f не функцией, а функтором. В конструкторе передавать ссылку на поток, а чтение делать в перегруженном operator().


A>Все верно, мне всего лишь хотелось чтобы такой функтор уже был в STL...


Что это за мания боятся написать простой код ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[9]: [Этюд] void f(T&) -> T f()
От: ankorol Украина  
Дата: 01.08.11 12:58
Оценка:
Здравствуйте, _nn_, Вы писали:

_nn_>Что это за мания боятся написать простой код ?

В теме указано что это этюд.
Re[11]: [Этюд] void f(T&) -> T f()
От: Centaur Россия  
Дата: 01.08.11 13:20
Оценка:
Здравствуйте, ankorol, Вы писали:

TB>>Тогда std::copy_n()


A>copy_n() это уже С++0х вроде


Когда нужный алгоритм есть в C++0x, TR1 или Boost, но по условию задачи ни то, ни другое, ни третье использовать нельзя, правильное решение состоит в использовании собственной карманной библиотеки полезных шаблонов. В которую тащить нужные шаблоны из TR1 и Boost’а.
Re[12]: [Этюд] void f(T&) -> T f()
От: TheBeard Россия  
Дата: 01.08.11 13:47
Оценка:
C>Когда нужный алгоритм есть в C++0x, TR1 или Boost, но по условию задачи ни то, ни другое, ни третье использовать нельзя, правильное решение состоит в использовании собственной карманной библиотеки полезных шаблонов. В которую тащить нужные шаблоны из TR1 и Boost’а.

В данном случае я бы затруднился придумать абстракцию, достаточно универсальную для библиотеки. Функтор ad hoc выглядит наиболее простым решением.
Re[13]: [Этюд] void f(T&) -> T f()
От: Centaur Россия  
Дата: 01.08.11 14:58
Оценка:
Здравствуйте, TheBeard, Вы писали:

C>>Когда нужный алгоритм есть в C++0x, TR1 или Boost, но по условию задачи ни то, ни другое, ни третье использовать нельзя, правильное решение состоит в использовании собственной карманной библиотеки полезных шаблонов. В которую тащить нужные шаблоны из TR1 и Boost’а.


TB>В данном случае я бы затруднился придумать абстракцию, достаточно универсальную для библиотеки. Функтор ad hoc выглядит наиболее простым решением.


В данном случае исходная задача — прочитать из входного потока заданное количество объектов известного типа. Это наиболее правильно решается алгоритмом copy_n. Абстракция, вынесенная в тему, не нужна.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.