Форум программистов, компьютерный форум CyberForum.ru

Анонимные функции, как параметр - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 675
Завершенные тесты: 1
26.03.2014, 20:13     Анонимные функции, как параметр #1
Здравствуйте. Есть проблема - много функций, каждой придумывать имена не хочу, тем более, что они мне не пригодятся. Суть такова:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void _F()
{
  Bla-bla-bla;
}
 
class Object
{
public:
  void (*F)();
 
  Object(_F){F=_F;}
  ~Object(){}
};
Object MY(_F);
Подскажите как сделать то-же, но минуя имя? Например, вместо:
C++
1
Object MY(_F);
нечто вроде:
C++
1
Object MY((Bla-bla-bla;));
Добавлено через 1 минуту
классно, что закрывающаяся скобка функции и точка с запятой - это
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
26.03.2014, 20:14     Анонимные функции, как параметр #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
template <class T>
void f(const T& functor)
{
    functor();  
}
 
int main()
{
    f([](){ std::cout << "Hello, Lambda!" << std::endl; });
    return 0;
}
http://ideone.com/A2zXEL
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 675
Завершенные тесты: 1
26.03.2014, 20:22  [ТС]     Анонимные функции, как параметр #3
Спасибо за быстрый ответ!
Цитата Сообщение от 0x10 Посмотреть сообщение
template <class T>
Это обязательно? Все функции принимают и возвращают аналогичные параметры.

Добавлено через 1 минуту
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Это обязательно?
Хотя сейчас сам буду пробовать, спасибо!
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
26.03.2014, 20:22     Анонимные функции, как параметр #4
Можно и конкретный тип определить. См std::function.
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 675
Завершенные тесты: 1
26.03.2014, 20:42  [ТС]     Анонимные функции, как параметр #5
Цитата Сообщение от 0x10 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
template <class T>
void f(const T& functor)
{
 functor(); 
}
int main()
{
 f([](){ std::cout << "Hello, Lambda!" << std::endl; });
 return 0;
}
А начиная с какой версии студии оно должно работать? 6.0, я так понимаю, "устаревшая"?
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
27.03.2014, 04:28     Анонимные функции, как параметр #6
Цитата Сообщение от Retyrn0 Посмотреть сообщение
А начиная с какой версии студии оно должно работать?
Стандарт С++11. Т.е. где-то с 2010 http://msdn.microsoft.com/en-US/en-e.../hh567368.aspx

Цитата Сообщение от Retyrn0 Посмотреть сообщение
6.0, я так понимаю, "устаревшая"?
Это та, которая вышла 16 лет назад? Да не, свежак.
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 675
Завершенные тесты: 1
27.03.2014, 10:50  [ТС]     Анонимные функции, как параметр #7
Цитата Сообщение от 0x10 Посмотреть сообщение
Это та, которая вышла 16 лет назад?
Год выпуска меня и того больше - даже в ужас вгоняет) В данный момент у меня нет возможности работать с другой по некоторым причинам. Альтернативы нет?
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
27.03.2014, 11:07     Анонимные функции, как параметр #8
Сюда посмотреть можно, но не знаю - взлетит ли http://www.boost.org/doc/libs/1_55_0...ml/lambda.html

Ну и на самом деле в первоначальной постановки проблемы не вижу. Нет ничего плохого в том, чтобы были полноценные локальные вспомогательные функции.
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 675
Завершенные тесты: 1
27.03.2014, 11:37  [ТС]     Анонимные функции, как параметр #9
Цитата Сообщение от 0x10 Посмотреть сообщение
Нет ничего плохого в том, чтобы были полноценные локальные вспомогательные функции.
В именах - их нужно придумывать. Другой вариант. У меня куча .h, которые использую этот класс. Нет возможности давать одинаковые имена, чтобы функция по имени была видна только внутри библиотеки?..сам считаю, что это довольно не логичный вопрос, но очень не хочется сочинять функциям имена.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
27.03.2014, 11:41     Анонимные функции, как параметр #10
Цитата Сообщение от Retyrn0 Посмотреть сообщение
но очень не хочется сочинять функциям имена
Это слишком субъективная причина, чтобы в нее упираться.

Цитата Сообщение от Retyrn0 Посмотреть сообщение
У меня куча .h, которые использую этот класс
В этих заголовках действительно нужно полное определение класса? Мб хватило бы объявления.

Цитата Сообщение от Retyrn0 Посмотреть сообщение
Нет возможности давать одинаковые имена, чтобы функция по имени была видна только внутри библиотеки?
Если в cpp файле функция объявлена как static, то снаружи она недоступна. Т.е. в разных cpp файлах могут быть static-функции с одинаковыми именами.
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 675
Завершенные тесты: 1
27.03.2014, 11:57  [ТС]     Анонимные функции, как параметр #11
Цитата Сообщение от 0x10 Посмотреть сообщение
Это слишком субъективная причина, чтобы в нее упираться.
Цитата Сообщение от 0x10 Посмотреть сообщение
В этих заголовках действительно нужно полное определение класса? Мб хватило бы объявления.
Именно! В отдельной библиотеке класс с конструктором, принимающим адрес функции, эта библиотека подключается к сотням других библиотек, в которых нужно объявить экземпляр класса, передав адрес на функцию. Библиотек много - много функций и не камильфо давать каждой из них имя с учётом того, что они имеют одну и ту же суть, но разную реализацию для каждого объекта. Т.е., например, объект может отображаться на экране с помощью функции DRAW(), но один объект - это картинка, второй - прямоугольник, третья круг, нужно, чтобы каждый из этих объектов выводился на экран по-своему. Зачем хранить картинку прямоугольник, если можно FillRect(). Я думаю вы понимаете о чём я.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
27.03.2014, 12:06     Анонимные функции, как параметр #12
На словах сложно на самом деле понять.
Мне вот думается, что этот мега-класс, который принимает указатель на функцию, скорее должен принимать указатель на базовый класс/интерфейс. Клиенты уже будут реализовывать его по-своему.

Как вариант, можно проиллюстрировать кодом? Пусть на небольшом и искусственном, но законченном примере такого класса и пары клиентов, которые его используют.
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 675
Завершенные тесты: 1
27.03.2014, 12:28  [ТС]     Анонимные функции, как параметр #13
Цитата Сообщение от 0x10 Посмотреть сообщение
можно проиллюстрировать кодом?
C++
1
2
3
4
5
6
7
8
9
10
11
//библиотека с классом Class.h
class Object
{
public:
  void (*DRAW)();
 
  Object(void (*draw)())
  {
    DRAW=draw;
  }
};
C++
1
2
3
4
5
6
7
8
9
//Библиотека 1
#include "Clas.h"
 
void DrawPic()
{
  //Выводим изображение на экран
}
 
Object Picture(DrawPic)
C++
1
2
3
4
5
6
7
8
9
//Библиотека 2
#include "Clas.h"
 
void DrawRectangle()
{
  //Выводим прямоугольник на экран
}
 
Object Rectangle(DrawRectangle)
И т.п. Только хотелось бы не использовать имена DrawPic и DrawRectangle.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
27.03.2014, 13:19     Анонимные функции, как параметр #14
Цитата Сообщение от Retyrn0 Посмотреть сообщение
хотелось бы не использовать имена DrawPic и DrawRectangle.
Если в каждой единице трансляции, которую Вы называете библиотекой будут только одна функция Draw*(), то можно, как это уже говорил 0x10, объявить функцию как static (ну или поместить ее в безымянное пространство имен ) и в каждом модуле дать ей одинаковое имя:

C++
1
2
3
4
5
6
7
8
9
//Библиотека N
#include "Clas.h"
 
static void Draw()
{
  //Выводим нечто на экран
}
 
Object TypeN( Draw );
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
27.03.2014, 13:23     Анонимные функции, как параметр #15
В общем, то, что я тут вижу - это какое-то вывернутое наизнанку наследование.
Решается определением базового класса/интерфейса в библиотеке и конкретных реализаций в клиентах.
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 675
Завершенные тесты: 1
27.03.2014, 13:45  [ТС]     Анонимные функции, как параметр #16
Цитата Сообщение от Tulosba Посмотреть сообщение
Если в каждой единице трансляции, которую Вы называете библиотекой будут только одна функция Draw*()
Нет, это для простоты. На самом деле у класса значительно больше адресов функций.

Добавлено через 2 минуты
Кроме вывода на экран объект нужно вращать, двигать, делать очень многие вещи. Но каждая из этих вещей каждым объектом делается по разному.

Добавлено через 4 минуты
Цитата Сообщение от 0x10 Посмотреть сообщение
Решается определением базового класса/интерфейса в библиотеке и конкретных реализаций в клиентах.
Вы имеете ввиду для каждого объект создавать свой класс с наследованием класса Object, в которо описаны все общие параметры?
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
27.03.2014, 13:50     Анонимные функции, как параметр #17
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Вы имеете ввиду для каждого объект создавать свой класс с наследованием класса Object, в которо описаны все общие параметры?
Да.

Судя по этому
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Кроме вывода на экран объект нужно вращать, двигать, делать очень многие вещи. Но каждая из этих вещей каждым объектом делается по разному.
Случай прям как по учебнику.
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 675
Завершенные тесты: 1
27.03.2014, 13:58  [ТС]     Анонимные функции, как параметр #18
Цитата Сообщение от 0x10 Посмотреть сообщение
Да.
Такая штука, например, нужно все объекты отобразить на экране из библиотеки, которая ничего не знает о существовании потомков класса Object. В этом вся проблема.

Добавлено через 3 минуты
Единственный выход - создать списки адресов функций в основной библиотеке, который инициализируется из библиотек объектов, в которой циклом выполняются функции по адресам, но тогда теряется смысл использования ООП. Я изначально собирался так сделать, но потом решил попытаться сделать "по человечески" - с ООП.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
27.03.2014, 13:59     Анонимные функции, как параметр #19
Цитата Сообщение от Retyrn0 Посмотреть сообщение
нужно все объекты отобразить на экране из библиотеки, которая ничего не знает о существовании потомков класса Object
Пусть принимает Object*, этого будет достаточно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.03.2014, 14:02     Анонимные функции, как параметр
Еще ссылки по теме:

C++ Как передать элемент структуры, как параметр функции
Можно ли передать указатель на функцию как параметр другой функции? C++
Rvalue ref как параметр функции. Странности с оптимизацией C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 675
Завершенные тесты: 1
27.03.2014, 14:02  [ТС]     Анонимные функции, как параметр #20
Цитата Сообщение от 0x10 Посмотреть сообщение
Пусть принимает Object*, этого будет достаточно.
Ааа. Т.е. в родительском классе оставить адреса функций, просто инициалзировать их из дочерних? Тогда да, спасибо!
Yandex
Объявления
27.03.2014, 14:02     Анонимные функции, как параметр
Ответ Создать тему
Опции темы

Текущее время: 16:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru