Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
#1

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

26.03.2014, 20:13. Просмотров 2174. Ответов 21
Метки нет (Все метки)

Здравствуйте. Есть проблема - много функций, каждой придумывать имена не хочу, тем более, что они мне не пригодятся. Суть такова:
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 минуту
классно, что закрывающаяся скобка функции и точка с запятой - это
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.03.2014, 20:13
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Анонимные функции, как параметр (C++):

String как параметр функции - C++
Подскажите, пожалуйста, что здесь не так. При компиляции выдаёт "синтаксическая ошибка: идентификатор "string"". Пробовал убрать <string> и...

лямбда как параметр функции - C++
здравствуйте, есть код: template<typename Container, typename...Args> void fafa(Container&& c, std::function<Args...> f) { ...

Имя файла как параметр функции - C++
Необходимо заполнить массив из файла, для этого нужно создать отдельную функцию параметром которой будет являться имя файла. Хотелось бы...

Задать функцию как параметр функции - C++
Написал программу для решения уравнения с вырожденным ядром, где по ходу решения вышли две по три идентичные функции. Хотел бы узнать как...

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

Передача функции как параметр шаблона - C++
Хочу передавать в шаблон любую функцию без параметров и вызывать ее из него. Как это сделать? Не работает, но примерно так должно...

21
0x10
2549 / 1729 / 264
Регистрация: 24.11.2012
Сообщений: 4,351
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
1
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
26.03.2014, 20:22  [ТС] #3
Спасибо за быстрый ответ!
Цитата Сообщение от 0x10 Посмотреть сообщение
template <class T>
Это обязательно? Все функции принимают и возвращают аналогичные параметры.

Добавлено через 1 минуту
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Это обязательно?
Хотя сейчас сам буду пробовать, спасибо!
0
0x10
2549 / 1729 / 264
Регистрация: 24.11.2012
Сообщений: 4,351
26.03.2014, 20:22 #4
Можно и конкретный тип определить. См std::function.
0
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 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, я так понимаю, "устаревшая"?
0
0x10
2549 / 1729 / 264
Регистрация: 24.11.2012
Сообщений: 4,351
27.03.2014, 04:28 #6
Цитата Сообщение от Retyrn0 Посмотреть сообщение
А начиная с какой версии студии оно должно работать?
Стандарт С++11. Т.е. где-то с 2010 http://msdn.microsoft.com/en-US/en-en/library/hh567368.aspx

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

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

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

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

Как вариант, можно проиллюстрировать кодом? Пусть на небольшом и искусственном, но законченном примере такого класса и пары клиентов, которые его используют.
0
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 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.
0
Tulosba
:)
Эксперт С++
4705 / 3240 / 297
Регистрация: 19.02.2013
Сообщений: 9,046
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 );
0
0x10
2549 / 1729 / 264
Регистрация: 24.11.2012
Сообщений: 4,351
27.03.2014, 13:23 #15
В общем, то, что я тут вижу - это какое-то вывернутое наизнанку наследование.
Решается определением базового класса/интерфейса в библиотеке и конкретных реализаций в клиентах.
2
27.03.2014, 13:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.03.2014, 13:23
Привет! Вот еще темы с ответами:

Указатель как входной параметр функции - C++
#include &lt;iostream&gt; const int Max = 5; int* fill_array(double ar, int limit); void show_array(const double ar, int* n) ; int*...

Указатель на структуру, как параметр функции - C++
Господа программисты! Прошу вашей помощи! Помогите передать функции в качестве аргумента указатель на структуру. Вот что есть: struct...

Двумерный массив как параметр функции - C++
Есть такая функция, загружающая элементы из бинарного файла в массив bool m1: void loadfromfile(char *filename, int col, int row) {...

Как передать элемент структуры, как параметр функции - C++
Помогите, пожалуйста. Есть структура, необходимо создать функцию сортировки, но при этом, чтобы можно было передавать элемент структуры,...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru