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

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

Войти
Регистрация
Восстановить пароль
 
Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 453
#1

Можно ли как-то передавать в функцию то поле, какое нужно печатать - C++

22.01.2014, 02:22. Просмотров 327. Ответов 8
Метки нет (Все метки)

Доброго времени суток, форумчане.
Имеется такая конструкция.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void print() {
    for (int j = 0; j < n; j++)
        cout << "--";
    cout << '-' << endl;
    for (int i = 0; i < m; i++) {
        cout << '|';
        for (int j = 0; j < n; j++)
            cout << pole[i][j].state << '|';
        cout << endl;
        for (int j = 0; j < n; j++)
            cout <<"--";
        cout << '-' << endl;
    }
}
где массив pole структурированный. Тут просто выводится на экран в виде таблицы числа. В структуре несколько числовых полей. Можно как-то передавать в функцию то поле, какое нужно печатать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.01.2014, 02:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Можно ли как-то передавать в функцию то поле, какое нужно печатать (C++):

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

Почему в функцию можно передавать аргументы с амперсандом или без него и результат тот же самый? - C++
К примеру : int main() { int x=3, y=4; swap(&amp;x,&amp;y); return 0; } void swap(int* a, int* b){ int tmp = *a; *a...

Что значит Handle hf? Что в эту функцию нужно передавать - C++
мне нужно создать функцию Node * ReadNode(HANDLE hf); (Node это структура) Так вот вопрос в том что значит Handle hf? Что в эту функцию...

Как передавать структуру в функцию? - C++
Вопрос глупый, возможно, но я совсем не понимаю, как. Есть у меня в программе стркутура: struct studentmark ...

Как правильно передавать указатель на функцию? - C++
Класс для очереди typedef unsigned size_t; template&lt;typename T&gt; struct List { T data; struct List&lt;T&gt;* next; ...

Можно ли массив передавать как параметр? - C++
Всем доброго дня! Короче, есть несеолько массивов, скажем два; - arrb и arrc. И есть функция типа int count();. Надо чтобы эта функция...

8
MrGluck
Модератор
Эксперт CЭксперт С++
7418 / 4533 / 673
Регистрация: 29.11.2010
Сообщений: 12,299
22.01.2014, 02:39 #2
Что есть pole?
Точнее что за pole.stat?
0
Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 453
22.01.2014, 02:45  [ТС] #3
C++
1
2
3
4
5
6
7
struct point {
    int state;
    int manh;
    int done;
};
 
point **pole;
Вот так.

Добавлено через 3 минуты
Мне необходимо вывести 3 таблицы. Вариант с тремя массивами не подходит.
Думал сделать отдельную функцию, которой я передаю число, там через условный оператор определяю соответствие, и возвращаю нужное значение. Но, может можно сделать проще?
0
MrGluck
Модератор
Эксперт CЭксперт С++
7418 / 4533 / 673
Регистрация: 29.11.2010
Сообщений: 12,299
22.01.2014, 03:06 #4
Можно передавать функтор как параметр шаблона.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
 
struct A
{
    int a, b;
};
 
struct First
{
    auto operator()(const A &obj) -> decltype(obj.a) {return obj.a; }
};
 
struct Second
{
    auto operator()(const A &obj) -> decltype(obj.b) {return obj.b; }
};
 
template <typename Function>
void print(const A &obj, Function fn)
{
    std::cout << fn(obj);
}
 
int main()
{
    A a {1, 2};
    print(a, First());
    print(a, Second());
}
1
Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 453
22.01.2014, 03:11  [ТС] #5
MrGluck, сложно сказать упростили или же наоборот
С такими конструкциями пока не сталкивался. Если можете, объясните немного подробнее что есть "предикат" и хотя бы в двух словах по коду.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7418 / 4533 / 673
Регистрация: 29.11.2010
Сообщений: 12,299
22.01.2014, 03:17 #6
Цитата Сообщение от Arkaniy Посмотреть сообщение
что есть "предикат"
Предикаты- подмножество функторов, в которых тип возвращаемого значения operator() bool. Предикаты используются в алгоритмах сортировок, поиска, а также во всех остальных, имеющих на конце _if. Смысл в том, что объект-функция в случае использования предиката возвращает истину или ложь в зависимости от выполнения необходимого условия. Это либо удовлетворение объектом неких свойств, либо результат сравнения двух объектов по определенному признаку.
http://www.quizful.net/post/functors-and-adapters-in-STL
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
 
struct A
{
    int a, b;
};
 
struct First // описываем структуру предикат First
{
    // auto - тип значения определяет компилятор, decltype - автоматически определить тип
    // то есть компилятор сам анализирует какой тип имеет возвращаемое значение
    // obj.a и возвращает переменную, имеющую соответствующий идентификатор типа
    auto operator()(const A &obj) -> decltype(obj.a) {return obj.a; }
};
 
struct Second
{
    auto operator()(const A &obj) -> decltype(obj.b) {return obj.b; }
};
 
// в качестве параметра шаблона выступает функция
template <typename Function>
void print(const A &obj, Function fn) // применяем нашу объект-функцию к A
{
    std::cout << fn(obj);
}
 
int main()
{
    A a {1, 2}; // brace initialization
    print(a, First());
    print(a, Second());
}
Добавлено через 1 минуту
Попробую написать на простых типах:
C++
1
2
3
4
5
6
7
8
9
struct First
{
    int operator()(const A &obj) {return obj.a; }
};
 
struct Second
{
    int operator()(const A &obj) {return obj.b; }
};
Думаю так многое проясняется. Осталось только понять работу ключевых слов auto и decltype из С++11.

Добавлено через 59 секунд
Кстати, такой же прием с объект-функцией использует алгоритм for_each
C++
1
2
3
4
5
6
7
8
9
template<class InputIterator, class Function>
  Function for_each(InputIterator first, InputIterator last, Function fn)
{
  while (first!=last) {
    fn (*first);
    ++first;
  }
  return fn;      // or, since C++11: return move(fn);
}
1
Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 453
22.01.2014, 03:19  [ТС] #7
MrGluck, спасибо большое, очень помогли.
С auto уже знаком, а decltype примусь штудировать.
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
22.01.2014, 05:07 #8
Arkaniy, можно передавать указатель на член класса:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void print(int point::* member) {
 
    // ...
 
    cout << pole[i][j].*member << '|';
 
    // ...
}
 
 
int main() {
    print(&point::state);
    print(&point::manh);
    print(&point::done);
}
http://ideone.com/miw4PC
1
Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 453
22.01.2014, 11:39  [ТС] #9
gray_fox, спасибо. Пока так и сделаю.
0
22.01.2014, 11:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.01.2014, 11:39
Привет! Вот еще темы с ответами:

Можно ли как-нибудь передавать функцию в аргумент сразу со своим аргументом? - C (СИ)
День добрый. Изучаю Си в качестве хобби, что-ли. Уровень владения на данный моменет - написание простеньких программулек с циклами и...

Focus как можно узнать какое поле выбрано - JavaScript
есть два поля #phone #adress' как можно узнать какое поле было нажато var inputFocusedNotTrueText; $('#phone, #adress').on('focus',...

Модифицировать программу так, чтобы можно было передавать функцию в виде делегата - C#
Модифицировать программу нахождения минимума функции так, чтобы можно было передавать функцию в виде делегата. Сделать меню с различными...

Как передавать указатель на функцию в функцию для ее выполнения? - C++ Qt
Здравствуйте! Вопрос следующий: Как передавать указатель на функцию в функцию для ее выполнения? Например: &lt;хедер&gt; ... void...


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

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

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