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

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

Восстановить пароль Регистрация
 
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 452
22.01.2014, 02:22     Можно ли как-то передавать в функцию то поле, какое нужно печатать #1
Доброго времени суток, форумчане.
Имеется такая конструкция.
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 структурированный. Тут просто выводится на экран в виде таблицы числа. В структуре несколько числовых полей. Можно как-то передавать в функцию то поле, какое нужно печатать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.01.2014, 02:22     Можно ли как-то передавать в функцию то поле, какое нужно печатать
Посмотрите здесь:

Зачем передавать в функцию X указатель на callback функцию, если последняя ВНЕШНЯЯ и вызовется БЕЗО ВСЯКОГО УКАЗАТЕЛЯ? C++
C++ Что значит Handle hf? Что в эту функцию нужно передавать
C++ можно ли создать такой именованый пейп , что по нему можно было передавать данные по сети?
C++ C++ как правильно передавать функцию как параметр?
Почему в функцию можно передавать аргументы с амперсандом или без него и результат тот же самый? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,416
22.01.2014, 02:39     Можно ли как-то передавать в функцию то поле, какое нужно печатать #2
Что есть pole?
Точнее что за pole.stat?
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 452
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 таблицы. Вариант с тремя массивами не подходит.
Думал сделать отдельную функцию, которой я передаю число, там через условный оператор определяю соответствие, и возвращаю нужное значение. Но, может можно сделать проще?
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,416
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());
}
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 452
22.01.2014, 03:11  [ТС]     Можно ли как-то передавать в функцию то поле, какое нужно печатать #5
MrGluck, сложно сказать упростили или же наоборот
С такими конструкциями пока не сталкивался. Если можете, объясните немного подробнее что есть "предикат" и хотя бы в двух словах по коду.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,416
22.01.2014, 03:17     Можно ли как-то передавать в функцию то поле, какое нужно печатать #6
Цитата Сообщение от Arkaniy Посмотреть сообщение
что есть "предикат"
Предикаты- подмножество функторов, в которых тип возвращаемого значения operator() bool. Предикаты используются в алгоритмах сортировок, поиска, а также во всех остальных, имеющих на конце _if. Смысл в том, что объект-функция в случае использования предиката возвращает истину или ложь в зависимости от выполнения необходимого условия. Это либо удовлетворение объектом неких свойств, либо результат сравнения двух объектов по определенному признаку.
http://www.quizful.net/post/functors...dapters-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);
}
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 452
22.01.2014, 03:19  [ТС]     Можно ли как-то передавать в функцию то поле, какое нужно печатать #7
MrGluck, спасибо большое, очень помогли.
С auto уже знаком, а decltype примусь штудировать.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.01.2014, 11:39     Можно ли как-то передавать в функцию то поле, какое нужно печатать
Еще ссылки по теме:

как лучше передавать значения в функцию? ссылки vs указатели C++
C++ когда вводится нуль,то программа не работает,нужно добавитть еще какое-то условие для нуля ,но я не знаю какое
C++ Можно ли массив передавать как параметр?

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

Или воспользуйтесь поиском по форуму:
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 452
22.01.2014, 11:39  [ТС]     Можно ли как-то передавать в функцию то поле, какое нужно печатать #9
gray_fox, спасибо. Пока так и сделаю.
Yandex
Объявления
22.01.2014, 11:39     Можно ли как-то передавать в функцию то поле, какое нужно печатать
Ответ Создать тему
Опции темы

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