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

Передать поле класса в функцию - C++

Восстановить пароль Регистрация
 
QVO
 Аватар для QVO
636 / 447 / 32
Регистрация: 26.10.2010
Сообщений: 1,261
Записей в блоге: 4
Завершенные тесты: 2
29.07.2015, 14:00     Передать поле класса в функцию #1
Здравствуйте форумчане.
Как передать поле класса в функцию с возможностью изменения значения этого поля?

Ссылка на компиляцию: http://ideone.com/qlBirp

Два класса для теста:
C++
1
2
3
4
5
6
class Genre
{
    public:
        Genre() = default;
    std::string name;   
};
C++
1
2
3
4
5
6
7
struct Provider
{
    public:
        Provider() = default;
    std::string name;   
    std::string logo;
};
Функция:
C++
1
2
3
4
5
6
template<typename Class, typename Field>
void foo(shared_ptr<Class> myClass, Field myField)
{
    std::cout << myClass->myField << std::endl;
    myClass->myField = "hello";
}
Применение:
C++
1
2
3
4
5
6
7
8
int main() {
    auto genre = std::make_shared<Genre>();
    auto provider = std::make_shared<Provider>();
    
    foo<Genre, std::string Genre::*name>(&genre, &genre->name);
    
    return 0;
}
С уважением QVO.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
smartpointer
 Аватар для smartpointer
64 / 58 / 23
Регистрация: 17.02.2014
Сообщений: 250
29.07.2015, 15:31     Передать поле класса в функцию #2
Вот так можно.
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>
#include <string>
 
class A
{
public:
    std::string str;
    A():str("Hello World\n")
    {
    }
    void Print()
    {
        std::cout<<str<<std::endl;
    }
};
 
typedef std::string A::*p_str;
 
template<typename First,typename FirstField>void Foo(First& first,FirstField First::*ptr )
{
    first.*ptr = "Hello\n";
}
 
 
int main()
{
    A a;
    p_str a_string = &A::str;
    a.Print();
    Foo(a,a_string);
    a.Print();
    return 0;
}
QVO
 Аватар для QVO
636 / 447 / 32
Регистрация: 26.10.2010
Сообщений: 1,261
Записей в блоге: 4
Завершенные тесты: 2
29.07.2015, 15:43  [ТС]     Передать поле класса в функцию #3
Погуглил на тему Pointer-to-member shared_ptr и вопрос решился.
C++
1
2
3
4
5
6
template <typename T, typename R>
void foo(std::shared_ptr<T>* ptr, R T::* member) 
{
    std::cout << ptr->get()->*member << std::endl;
    ptr->get()->*member = "...";
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main() {
    auto genre = std::make_shared<Genre>();
    auto provider = std::make_shared<Provider>();
    
    genre->name = "123";
    provider->logo = "http://";
 
    foo<Genre, std::string>(&genre, &Genre::name);
    foo<Genre, std::string>(&genre, &Genre::name);
    
    foo<Provider, std::string>(&provider, &Provider::logo);
    foo<Provider, std::string>(&provider, &Provider::logo);
    
    
    return 0;
}
Вывод:
Код
123
...
http://
...
Ссылка на компиляцию: http://ideone.com/qlBirp
nmcf
4316 / 3737 / 1260
Регистрация: 14.04.2014
Сообщений: 14,661
29.07.2015, 15:44     Передать поле класса в функцию #4
Это не противоречит принципам ООП? Поля должны изменять функции-члены.
QVO
 Аватар для QVO
636 / 447 / 32
Регистрация: 26.10.2010
Сообщений: 1,261
Записей в блоге: 4
Завершенные тесты: 2
29.07.2015, 15:54  [ТС]     Передать поле класса в функцию #5
nmcf,

Не по теме:

можно 10к строк однотипного кода сократить до 200. Все зависит от задачи.

Yandex
Объявления
29.07.2015, 15:54     Передать поле класса в функцию
Ответ Создать тему
Опции темы

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