Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 13.10.2016
Сообщений: 5
1

Шаблоннный клас как параметр шаблона

01.02.2018, 13:06. Показов 1158. Ответов 7

Если в кратце:

Имеется такой код:
C++
1
typedef ByteStuffing<USART0, CRC8<USART0> > StreamDelimiter;
В шаблоне CRC8 тип всегда должен быть тем же самым, что и первый тип в шаблоне ByteStuffing
Можно ли это отразить в объявлении шаблона ByteStuffing, чтобы потом писать вот так:
C++
1
typedef ByteStuffing<USART0, CRC8> StreamDelimiter;
template ByteStuffing

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
template<typename T, typename C>
class ByteStuffing
{
    public:
 
        static void putc( const uint8_t byte )
        {
            switch ( byte )
            {
                case 0x7E:
                    escape_7e();
                    return;
 
                case 0x7D:
                    escape_7d();
                    return;
 
                default:
                    write_payload_byte( byte );
            }
        }
 
        static void begin()
        {
            bound();
            C::reset();
        }
 
        static void end()
        {
            C::write();
            bound();
            C::reset();
        }
 
 
    private:
 
        static void bound()
        {
            T::putc( 0x7E );
        }
 
        static void escape_7e()
        {
            write_payload_byte( 0x7D );
            write_payload_byte( 0x5E );
        }
 
        static void escape_7d()
        {
            write_payload_byte( 0x7D );
            write_payload_byte( 0x5D );
        }
 
        static void write_payload_byte( const uint8_t byte )
        {
            C::calc( byte );
            T::putc( byte );
        }
};

template CRC8
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
template<typename T>
class CRC8
{
    public:
 
        static void calc( const uint8_t byte )
        {
            CRC8::crc ^= byte;
            for ( char i = 0; i < 8; ++i )
            {
                if ( CRC8::crc & 0x80 )
                {
                    CRC8::crc = static_cast<uint8_t>(( CRC8::crc << 1 ) ^ 0x31);
                }
                else
                {
                    CRC8::crc <<= 1;
                }
            }
        }
 
        static void reset()
        {
            crc = 0xFF;
        }
 
        static void write()
        {
            T::putc( crc );
        }
 
    private:
 
        static uint8_t crc;
};
 
template<typename T>
uint8_t CRC8<T>::crc = 0xFF;



__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.02.2018, 13:06
Ответы с готовыми решениями:

Как объявить глобальную ссылку на клас с конструктором, принимающим один параметр
Столкнулся с проблемой. Пытаюсь в классе №1 создать переменную класса №2, а уже потом в...

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

Свой тип как параметр шаблона
Есть вопрос по коду: #include &lt;iostream&gt; #include &lt;memory&gt; #include &lt;vector&gt; using namespace...

Зачем нужен шаблон как параметр шаблона?
Видел много примеров, но что-то не особо понятно зачем и как это работает.

7
277 / 226 / 93
Регистрация: 27.06.2016
Сообщений: 639
01.02.2018, 13:18 2
C++
1
2
3
4
5
6
7
template<typename K, template<typename> typename C> using Map=map<K,C<K>>;
 
int main() {
    Map<int,vector> m;
    m[4] = {1,2,3};
    return 0;
}
Нагуглил здесь (template template parameter)
http://en.cppreference.com/w/c... parameters
1
Don't worry, be happy
17208 / 10085 / 1946
Регистрация: 27.09.2012
Сообщений: 25,165
Записей в блоге: 1
01.02.2018, 13:33 3
Лучший ответ Сообщение было отмечено vasya-gaykin как решение

Решение

C++
1
2
3
4
5
6
7
8
template<typename T, template<typename> class C>
class ByteStuffing
{
    typedef C<T> C_T;//Псевдоним для C<T>
    //...
};
//...
typedef ByteStuffing<USART0, CRC8> StreamDelimiter;//ok
1
0 / 0 / 0
Регистрация: 13.10.2016
Сообщений: 5
01.02.2018, 13:43  [ТС] 4
excellent!!!

template ByteStuffing
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
template<typename T, template<typename> typename C>
class ByteStuffing
{
    public:
 
        static void putc( const uint8_t byte )
        {
            switch ( byte )
            {
                case 0x7E:
                    escape_7e();
                    return;
 
                case 0x7D:
                    escape_7d();
                    return;
 
                default:
                    write_payload_byte( byte );
            }
        }
 
        static void begin()
        {
            bound();
            C<T>::reset();
        }
 
        static void end()
        {
            C<T>::write();
            bound();
            C<T>::reset();
        }
 
 
    private:
 
        static void bound()
        {
            T::putc( 0x7E );
        }
 
        static void escape_7e()
        {
            write_payload_byte( 0x7D );
            write_payload_byte( 0x5E );
        }
 
        static void escape_7d()
        {
            write_payload_byte( 0x7D );
            write_payload_byte( 0x5D );
        }
 
        static void write_payload_byte( const uint8_t byte )
        {
            C<T>::calc( byte );
            T::putc( byte );
        }
};
0
Don't worry, be happy
17208 / 10085 / 1946
Регистрация: 27.09.2012
Сообщений: 25,165
Записей в блоге: 1
01.02.2018, 13:44 5
vasya-gaykin, всё-таки рекомендую typedef-имя завести.
1
0 / 0 / 0
Регистрация: 13.10.2016
Сообщений: 5
01.02.2018, 13:58  [ТС] 6
Да так будет еще правильнее, спасибо всем!
0
Don't worry, be happy
17208 / 10085 / 1946
Регистрация: 27.09.2012
Сообщений: 25,165
Записей в блоге: 1
01.02.2018, 14:01 7
vasya-gaykin, а зачем делать CRC8 шаблоном, там же T не используется?
0
0 / 0 / 0
Регистрация: 13.10.2016
Сообщений: 5
01.02.2018, 14:04  [ТС] 8
Используется
C++
1
2
3
4
        static void write()
        {
            T::putc( crc );
        }
еще есть класс CRCNull и потом можно спокойно добавить CRC16, который будет уже 2 байта суммы писать
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.02.2018, 14:04

Указатель на статический массив как параметр шаблона
Добрый день. Необходимо параметр шаблона сделать указателем и передавать в него указатель на...

Как можно изменить параметр шаблона (template)?
есть такие классы: class abstract { public: virtual int method() = 0; // Допустим }; class...

Передать шаблонный класс, как параметр шаблона
нужно не используя stl написать аналог класса list. написал болванку и застрял template&lt;class C&gt;...

Результат работы функции как параметр шаблона
В старом с++ билдере такое работало, новый clang ругается. template &lt;class T, const IID* piid =...


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

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

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