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

Шаблон класса Wrapper - C++

Восстановить пароль Регистрация
 
stima
429 / 284 / 16
Регистрация: 22.03.2011
Сообщений: 923
Завершенные тесты: 1
01.08.2014, 19:00     Шаблон класса Wrapper #1
Как мне написать такой шаблон.

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
template<typename WrappedType>
class Wrapper 
{
 
protected:
    template <typename R, typename... Args>
    void connect(R (WrappedType::*mem_func)(Args...), Args&&... args)
    {
        std::function<R(Args...)> f = std::bind(mem_func, static_cast<WrappedType*>(this), std::forward<Args>(args)...);
    }
};
 
class Test : public Wrapper<Test>
{
 
public:
    Test()
    {
        connect<void()>(&Test::a);
        connect<void(int)>(&Test::a1, std::placeholders::_1);
    }
 
    void a()
    {
        std::cout << "Test::a" << std::endl;
    }
 
    void a1(int _1)
    {
        std::cout << "Test::a1 " << _1 << std::endl;
    }
};
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6416 / 3790 / 876
Регистрация: 30.01.2014
Сообщений: 6,575
01.08.2014, 19:29     Шаблон класса Wrapper #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от stima Посмотреть сообщение
Как мне написать такой шаблон.
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
34
35
36
37
38
39
template<typename WrappedType>
class Wrapper
{
    template <typename FType>
    struct Extract;
 
    template <typename R, typename... Args>
    struct Extract<R(Args...)>
    {
        typedef R (WrappedType::*mem_func_type)(Args...);
    };
protected:
    template <typename FType, typename... Args>
    void connect(typename Extract<FType>::mem_func_type mem_func, Args &&  ...args)
    {
        std::function<FType> f = std::bind(mem_func, static_cast<WrappedType*>(this), std::forward<Args>(args)...);
    }
};
 
class Test : public Wrapper<Test>
{
 
public:
    Test()
    {
        connect<void()>(&Test::a);
        connect<void(int)>(&Test::a1, std::placeholders::_1);
    }
 
    void a()
    {
        std::cout << "Test::a" << std::endl;
    }
 
    void a1(int _1)
    {
        std::cout << "Test::a1 " << _1 << std::endl;
    }
};
Оно?
stima
429 / 284 / 16
Регистрация: 22.03.2011
Сообщений: 923
Завершенные тесты: 1
01.08.2014, 20:09  [ТС]     Шаблон класса Wrapper #3
Спасибо. Можете обьяснить пожалуйста?
DrOffset
6416 / 3790 / 876
Регистрация: 30.01.2014
Сообщений: 6,575
01.08.2014, 20:12     Шаблон класса Wrapper #4
Цитата Сообщение от stima Посмотреть сообщение
Спасибо. Можете обьяснить пожалуйста?
Могу. Что конкретно не получается?
Yandex
Объявления
01.08.2014, 20:12     Шаблон класса Wrapper
Ответ Создать тему
Опции темы

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