Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
Любитель чаепитий
3509 / 1623 / 504
Регистрация: 24.08.2014
Сообщений: 5,545
Записей в блоге: 1
1

Сломался шаблон класса ini_file

22.08.2016, 14:06. Просмотров 628. Ответов 24
Метки нет (Все метки)

Добрый день. В общем изучал я себе шаблоны, изучал, и вдруг решил попробовать переписать свой старый класс ini_file, чтобы он мог работать не только с std::string, но и с std::wstring. Написал я, конечно, говнокод, но мне в голову не идет, почему выдает ошибку о том, что такой специализации нет и как её исправить?

Вот код:
ini.hpp

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
/////////////////////////////////////////////////////////////////////////////////////////
#include <regex>
#include <string>
#include <vector>
#include <utility>
#include <fstream>
/////////////////////////////////////////////////////////////////////////////////////////
namespace tools
{
    /////////////////////////////////////////////////////////////////////////////////////
    struct Std_IO
    {
        using Str_type          = std::string;
        using Fily_type         = std::fstream;
        using Input_file_type   = std::ifstream;
        using Output_file_type  = std::ofstream;
    };
    /////////////////////////////////////////////////////////////////////////////////////
    struct Wstd_IO
    {
        using Str_type          = std::wstring;
        using Fily_type         = std::wfstream;
        using Input_file_type   = std::wifstream;
        using Output_file_type  = std::wofstream;
    };
    /////////////////////////////////////////////////////////////////////////////////////
    template< typename IO_type >
    using ini_map = std::vector<
                        std::pair<
                            typename IO_type::Str_type,
                            typename IO_type::Str_type
                                 >
                               >;
    /////////////////////////////////////////////////////////////////////////////////////
    template< class IO_type >
    class ini_file
    {
        //-------------------------------------------------------------------------------
        using Str_type = typename IO_type::Str_type;
        //-------------------------------------------------------------------------------
    public:
        //-------------------------------------------------------------------------------
        ini_file( const Str_type& file_name );
        //-------------------------------------------------------------------------------
        void                    load_from_file( const Str_type& file_name );
        //-------------------------------------------------------------------------------
        void                    save_file();
        //-------------------------------------------------------------------------------
        Str_type&            get( const Str_type& name_var );
        //-------------------------------------------------------------------------------
        const Str_type&      get( const Str_type& name_var ) const;
        //-------------------------------------------------------------------------------
        Str_type&     operator[]( const Str_type& name_var );
        //-------------------------------------------------------------------------------
        const Str_type& operator[]( const Str_type& name_var ) const;
        //-------------------------------------------------------------------------------
    private:
        //-------------------------------------------------------------------------------
        Str_type               file_name_;
        ini_map< IO_type >     map_file;
        static Str_type        err_;
    };
};
/////////////////////////////////////////////////////////////////////////////////////////
namespace tools
{
    //-----------------------------------------------------------------------------------
    template< class IO_type >
    using Str_type = typename IO_type::Str_type;
    //-----------------------------------------------------------------------------------
    template< class IO_type >
    typename IO_type::Str_type ini_file< IO_type >::err_ = "";
    //-----------------------------------------------------------------------------------
    template< class IO_type >
    ini_file< IO_type >::ini_file( const Str_type& file_name )
    {
        load_from_file( file_name );
        file_name_ = file_name;
    }
    //-----------------------------------------------------------------------------------
    template< class IO_type >
    void ini_file< IO_type >::load_from_file( const Str_type& file_name )
    {
        #define COMMENT_SYMBOL '#'
 
        typename IO_type::Input_file_type file( file_name );
        if  ( !file )
        {
            throw std::runtime_error( "Error open file" );
        }
        Str_type copy_str{};
 
        while( !file.eof() )
        {
            std::getline( file, copy_str );
            if  ( copy_str[0] == COMMENT_SYMBOL )
            {
                map_file.push_back( std::make_pair( copy_str, "" ) );
                continue;
            }
            if  ( copy_str.size() < 1 )
            {
                continue;
            }
            std::smatch match_var;
            std::regex_search( copy_str, match_var, std::regex( "(.*)=(.*)" ) );
            map_file.push_back( std::make_pair( match_var[1], match_var[2] ) );
        }
        file_name_ = file_name;
 
        #undef COMMENT_SYMBOL
    }
    //-----------------------------------------------------------------------------------
    template< class IO_type >
    void ini_file< IO_type >::save_file()
    {
        #define COMMENT_SYMBOL '#'
 
        typename IO_type::Output_file_type file( file_name_ );
        if  ( !file )
        {
            throw std::runtime_error( "Error open file" );
        }
 
        for(const auto& i : map_file )
        {
            if  ( i.first[0] == COMMENT_SYMBOL )
            {
                file << i.first << std::endl;
                continue;
            }
            file
                << i.first
                << "="
                << i.second
                << std::endl;
        }
 
        #undef COMMENT_SYMBOL
    }
    //-----------------------------------------------------------------------------------
    template< class IO_type >
    Str_type< IO_type >& ini_file< IO_type >::get( const Str_type& name_var )
    {
        auto find = [] (
                        const Str_type& find_var,
                        ini_map< IO_type >& map
                       )
                       -> Str_type&
        {
            for( auto& i : map )
            {
                if  ( i.first == find_var )
                {
                    return i.second;
                }
            }
            return ini_file::err_;
        };
        return find( name_var, map_file );
    }
    //-----------------------------------------------------------------------------------
    template< class IO_type >
    const Str_type< IO_type >& ini_file< IO_type >::get( const Str_type& name_var ) const
    {
        return get( name_var );
    }
    //-----------------------------------------------------------------------------------
    template< class IO_type >
    Str_type< IO_type >& ini_file< IO_type >::operator[] ( const Str_type& name_var )
    {
        return get( name_var );
    }
    //-----------------------------------------------------------------------------------
    template< class IO_type >
    const Str_type< IO_type >& ini_file< IO_type >::operator[] ( const Str_type& name_var ) const
    {
        return get( name_var );
    }
    //-----------------------------------------------------------------------------------
};

main.cpp
C++
1
2
3
4
5
6
#include "ini.hpp"
 
int main()
{
    tools::ini_file<tools::Std_IO> file;
}

Так же мне бы хотелось, чтобы мне подсказали, как мне уменьшить данный код. Просто где-то в глубине души я понимаю, что код этот очень большой, но уменьшить его можно, только я ещё пока не знаю -- как.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.08.2016, 14:06
Ответы с готовыми решениями:

Шаблон родительского класса и шаблон класса потомка
Запутался, как правильно пронаследоваться от шаблона класса? #include &lt;iostream&gt; #include...

Шаблоны функций, Ошибка: для использования класса шаблон требуется список аргументов шаблон
Есть у меня 3 структуры Трамвай , Троллейбус , Автобус. Для автобуса определены функции (работают)...

Шаблон класса, параметром которого должны являться наследники определённого класса
Сразу извиняюсь за нубский вопрос. Суть в том, что я хочу сделать шаблон класса, параметром...

Написать шаблон класса на основе класса vector для реализации стековой структуры данных
Пыталась написать код, но не уверена будет ли такая реализация корректной, можно ли это сделать...

24
13692 / 7320 / 1746
Регистрация: 30.01.2014
Сообщений: 12,261
22.08.2016, 14:27 2
Цитата Сообщение от GbaLog- Посмотреть сообщение
почему выдает ошибку о том, что такой специализации нет и как её исправить?
У тебя нет конструктора по умолчанию. А объект ты конструируешь именно с ним.
1
Эксперт С++
8274 / 3850 / 837
Регистрация: 15.11.2014
Сообщений: 8,726
22.08.2016, 14:29 3
Цитата Сообщение от GbaLog- Посмотреть сообщение
tools::ini_file<tools::Std_IO> file;
у него нет конструктора по умолчанию
1
Любитель чаепитий
3509 / 1623 / 504
Регистрация: 24.08.2014
Сообщений: 5,545
Записей в блоге: 1
22.08.2016, 15:43  [ТС] 4
DrOffset, hoggy, Всё так очевидно оказалось, а я и на конструктор-то не посмотрел, хотя ошибка явно на это и указывала. А по "уменьшению" класса нет предложений?
0
13692 / 7320 / 1746
Регистрация: 30.01.2014
Сообщений: 12,261
22.08.2016, 15:54 5
Цитата Сообщение от GbaLog- Посмотреть сообщение
А по "уменьшению" класса нет предложений?
Тут переписать надо, а не уменьшать.
Велосипедный find выкинуть - заменить на стандартный.
define убрать - заменить на enum
Проверок добавить, а то на некоторых входных данных будем влетать в UB.
Статический объект в качестве флага ошибки тоже убрать бы - как ты предлагаешь проверять, что произошло? Брать адрес? Но и это тут не получится, т.к. объект приватный - до него не добраться.
1
Любитель чаепитий
3509 / 1623 / 504
Регистрация: 24.08.2014
Сообщений: 5,545
Записей в блоге: 1
22.08.2016, 15:58  [ТС] 6
DrOffset, Флаг ошибки тут для того, чтобы возвращать из функции, где возвращается ссылка на некоторую строку.
C++
1
Str_type&            get( const Str_type& name_var );
Что мне тут возвратить, если элемента нет?

Добавлено через 1 минуту
Цитата Сообщение от DrOffset Посмотреть сообщение
Велосипедный find выкинуть - заменить на стандартный.
Это ок.
Цитата Сообщение от DrOffset Посмотреть сообщение
define убрать - заменить на enum
Тоже ок.
Цитата Сообщение от DrOffset Посмотреть сообщение
Проверок добавить, а то на некоторых входных данных будем влетать в UB.
Где? Хотя бы номера строк.
0
Эксперт С++
8274 / 3850 / 837
Регистрация: 15.11.2014
Сообщений: 8,726
22.08.2016, 15:59 7
Цитата Сообщение от GbaLog- Посмотреть сообщение
А по "уменьшению" класса нет предложений?
сначала доведите до компилябельного состояния:
http://rextester.com/RKIRO65951

потом можно будет думать что можно улучшить.
0
Любитель чаепитий
3509 / 1623 / 504
Регистрация: 24.08.2014
Сообщений: 5,545
Записей в блоге: 1
22.08.2016, 16:03  [ТС] 8
hoggy,
http://rextester.com/WSSEK8100
Сделано. Всего лишь надо было исправить ошибку в main().
0
13692 / 7320 / 1746
Регистрация: 30.01.2014
Сообщений: 12,261
22.08.2016, 16:05 9
GbaLog-, давай начнем с другого. У тебя реально есть необходимость менять строку, которую возвращает твой класс?
Т.е. вот это - нормальный сценарий??
C++
1
2
std::string & str = iniObj.get("some");
str = "something";
Если да, то только приглядись какая фигня получается: допустим элемента some - нет (во-первых юзер класса даже это никак не поймет), ему вернется ссылка на статический объект, в который он запишет данные и успокоится.
Потом он создаст еще один объект ini_file, но с другим файлом, в котором элемента some тоже нет, и запросит его. Ему вернется, тем не менее, строка "something". Чудеса. Не говоря уж про то, как это будет работать в разных потоках.
Если же строку внутри менять не надо, то и думать тут нечего - возвращай по значению.

Добавлено через 1 минуту
Цитата Сообщение от GbaLog- Посмотреть сообщение
Где? Хотя бы номера строк.
Так не интересно. Если я все расскажу, то опыта ты не получишь
Попробуй скармливать своему парсеру разные некорректные файлы.
0
Любитель чаепитий
3509 / 1623 / 504
Регистрация: 24.08.2014
Сообщений: 5,545
Записей в блоге: 1
22.08.2016, 16:45  [ТС] 10
Цитата Сообщение от DrOffset Посмотреть сообщение
У тебя реально есть необходимость менять строку, которую возвращает твой класс?
Да, иначе зачем он ещё нужен?
Цитата Сообщение от DrOffset Посмотреть сообщение
допустим элемента some - нет (во-первых юзер класса даже это никак не поймет), ему вернется ссылка на статический объект, в который он запишет данные и успокоится.
Вы натолкнули меня на очень интересную мысль, а что если сделать так же, как в std::map? То есть если объекта нет, то мы его создадим. Тогда и флаг ошибки не понадобится вовсе, по крайней мере для того, чтобы возвращать его.
Цитата Сообщение от DrOffset Посмотреть сообщение
Если я все расскажу, то опыта ты не получишь
Не хочу думать.

Добавлено через 23 минуты
DrOffset, Обезопасился как мог. Или нет. Все Ваши советы учёл, ну и реализовал то, что предлагал выше.
http://rextester.com/SZO8022
Кликните здесь для просмотра всего текста

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
/////////////////////////////////////////////////////////////////////////////////////////
#include <regex>
#include <string>
#include <vector>
#include <utility>
#include <fstream>
#include <algorithm>
/////////////////////////////////////////////////////////////////////////////////////////
namespace tools
{
    /////////////////////////////////////////////////////////////////////////////////////
    struct Std_IO
    {
        using Str_type          = std::string;
        using Fily_type         = std::fstream;
        using Input_file_type   = std::ifstream;
        using Output_file_type  = std::ofstream;
    };
    /////////////////////////////////////////////////////////////////////////////////////
    struct Wstd_IO
    {
        using Str_type          = std::wstring;
        using Fily_type         = std::wfstream;
        using Input_file_type   = std::wifstream;
        using Output_file_type  = std::wofstream;
    };
    /////////////////////////////////////////////////////////////////////////////////////
    template< class IO_type >
    class ini_file
    {
        //-------------------------------------------------------------------------------
        using Str_type = typename IO_type::Str_type;
        using ini_map = std::vector< 
                                std::pair< 
                                            Str_type, 
                                            Str_type 
                                         > 
                                   >;
        //-------------------------------------------------------------------------------
        enum { e_comment = '#' };
        //-------------------------------------------------------------------------------
    public:
        //-------------------------------------------------------------------------------
        ini_file( const Str_type& file_name );
        //-------------------------------------------------------------------------------
        void                    load_from_file( const Str_type& file_name );
        //-------------------------------------------------------------------------------
        void                    save_file();
        //-------------------------------------------------------------------------------
        Str_type&               add( const Str_type& name_var, const Str_type& value );
        //-------------------------------------------------------------------------------
        Str_type&               get( const Str_type& name_var );
        //-------------------------------------------------------------------------------
        const Str_type&         get( const Str_type& name_var ) const;
        //-------------------------------------------------------------------------------
        Str_type&        operator[]( const Str_type& name_var );
        //-------------------------------------------------------------------------------
        const Str_type&  operator[]( const Str_type& name_var ) const;
        //-------------------------------------------------------------------------------
    private:
        //-------------------------------------------------------------------------------
        Str_type               file_name_;
        ini_map                map_file;
    };
};
/////////////////////////////////////////////////////////////////////////////////////////
namespace tools
{
    //-----------------------------------------------------------------------------------
    template< class IO_type >
    using Str_type = typename IO_type::Str_type;
    //-----------------------------------------------------------------------------------
    template< class IO_type >
    ini_file< IO_type >::ini_file( const Str_type& file_name )
    {
        load_from_file( file_name );
        file_name_ = file_name;
    }
    //-----------------------------------------------------------------------------------
    template< class IO_type >
    void ini_file< IO_type >::load_from_file( const Str_type& file_name )
    {
        typename IO_type::Input_file_type file( file_name );
        if  ( !file )
        {
            throw std::runtime_error( "Error open file" );
        }
        Str_type copy_str{};
 
        while( !file.eof() )
        {
            std::getline( file, copy_str );
            if  ( copy_str[0] == e_comment )
            {
                map_file.push_back( std::make_pair( copy_str, "" ) );
                continue;
            }
            if  ( copy_str.size() < 1 )
            {
                continue;
            }
            std::smatch match_var;
            try
            {
                std::regex_search( copy_str, match_var, std::regex( "(.*)=(.*)" ) );
            }
            catch(...)
            {
                throw std::runtime_error( "Incorrect string in file" );
            }
            map_file.push_back( std::make_pair( match_var[1], match_var[2] ) );
        }
        file_name_ = file_name;
    }
    //-----------------------------------------------------------------------------------
    template< class IO_type >
    void ini_file< IO_type >::save_file()
    {
        typename IO_type::Output_file_type file( file_name_ );
        if  ( !file )
        {
            throw std::runtime_error( "Error open file" );
        }
 
        for(const auto& i : map_file )
        {
            if  ( i.first[0] == e_comment )
            {
                file << i.first << std::endl;
                continue;
            }
            file
                << i.first
                << "="
                << i.second
                << std::endl;
        }
    }
    //-----------------------------------------------------------------------------------
    template< class IO_type >
    Str_type< IO_type >& ini_file< IO_type >::add( 
                                            const Str_type& name_var,
                                            const Str_type& value 
                                                )
    {
        map_file.push_back( std::make_pair( name_var, value ) );
        return map_file.at(map_file.size() - 1).second;
    }
    //-----------------------------------------------------------------------------------
    template< class IO_type >
    Str_type< IO_type >& ini_file< IO_type >::get( const Str_type& name_var )
    {
        
        auto iter = std::find_if( 
                            map_file.begin(), 
                            map_file.end(), 
                            [&name_var] (auto var)
                            {
                                return var.first == name_var;
                            }
                               );
        if  ( iter == map_file.end() )
        {
            return add( name_var, "" );
        }
        return *iter;
    }
    //-----------------------------------------------------------------------------------
    template< class IO_type >
    const Str_type< IO_type >& ini_file< IO_type >::get( const Str_type& name_var ) const
    {
        return get( name_var );
    }
    //-----------------------------------------------------------------------------------
    template< class IO_type >
    Str_type< IO_type >& ini_file< IO_type >::operator[] ( const Str_type& name_var )
    {
        return get( name_var );
    }
    //-----------------------------------------------------------------------------------
    template< class IO_type >
    const Str_type< IO_type >& ini_file< IO_type >::operator[] ( const Str_type& name_var ) const
    {
        return get( name_var );
    }
    //-----------------------------------------------------------------------------------
};
 
 
 
 
#include <iostream>
 
int main()
{
    std::cout << "Hello, world!\n";
    
    tools::ini_file<tools::Std_IO> file( "ololo.ini" );
    
}
0
Эксперт С++
8274 / 3850 / 837
Регистрация: 15.11.2014
Сообщений: 8,726
22.08.2016, 17:00 11
GbaLog-,

1.
сделайте так, что бы шаблон параметризовался не типом строки
а типом символа: char или wchar_t

2.
избавьтесь от std::vector
вместо него используйте std::unordered_map

3.
лучше заранее приучать себя к кодестайлам,
которые используется в реальных компаниях.

этот дикий ужасс в духе господина MrX
что вы демонстрируете в своём коде
не пройдет ни одно ревью.
1
13692 / 7320 / 1746
Регистрация: 30.01.2014
Сообщений: 12,261
22.08.2016, 17:02 12
Цитата Сообщение от GbaLog- Посмотреть сообщение
Да, иначе зачем он ещё нужен?
Надо сказать, обычно такое как раз не требуется. Обычно конфиги только читают, редко записывают.
Если и надо записывать, то это делается отдельными функциями, а не неявно через ссылки.
Посмотри на дизайн библиотеки libconfig. Она хоть и сишная, но все основные идеи подобных инструментов отражает.

Цитата Сообщение от GbaLog- Посмотреть сообщение
То есть если объекта нет, то мы его создадим.
Этот вариант приемлемый.

Цитата Сообщение от GbaLog- Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
std::smatch match_var;
try 
{ 
    std::regex_search( copy_str, match_var, std::regex( "(.*)=(.*)" ) ); 
} 
catch(...) 
{ 
    throw std::runtime_error( "Incorrect string in file" ); 
}
Смотри справку по regex_search и smatch, а то это просто ужас
Но место ты нашел правильно. Пофиксил только неправильно, от UB не защитился.
1
Эксперт С++
8274 / 3850 / 837
Регистрация: 15.11.2014
Сообщений: 8,726
22.08.2016, 17:06 13
Цитата Сообщение от GbaLog- Посмотреть сообщение
То есть если объекта нет, то мы
либо создаем по дефолту если дефолтное значение было заявлено.
либо бросаем эксепшен

Добавлено через 2 минуты

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
а то это просто ужас
Цитата Сообщение от DrOffset Посмотреть сообщение
(.*)=(.*)
ну клевые же титьки получились :)

0
Любитель чаепитий
3509 / 1623 / 504
Регистрация: 24.08.2014
Сообщений: 5,545
Записей в блоге: 1
22.08.2016, 17:12  [ТС] 14
Цитата Сообщение от hoggy Посмотреть сообщение
сделайте так, что бы шаблон параметризовался не типом строки
а типом символа: char или wchar_t
Типа через std::basic_string<T>? Что-то даже не представляю, как это сделать. Разве что заменить в коде все объявления std::string на std::basic_string<T> и std::basic_fstream<T>, но это геморрой ещё тот.
Цитата Сообщение от hoggy Посмотреть сообщение
избавьтесь от std::vector
вместо него используйте std::unordered_map
Мне важно, чтобы сохранялся порядок переменных, потому что в них могут присутствовать комментарии, а std::unordered_map не гарантирует того, что порядок останется таким, каким и был.
Цитата Сообщение от hoggy Посмотреть сообщение
3.
лучше заранее приучать себя к кодестайлам,
которые используется в реальных компаниях.
Найти бы их ещё где-нибудь. Ибо Google C++ Style Guide на английском, а я с ним хоть и пытаюсь дружить, да он со мной не хочет. Так-то с каждым днём понимаю, что такой стиль очень сложно поддерживать.
Цитата Сообщение от DrOffset Посмотреть сообщение
Если и надо записывать, то это делается отдельными функциями, а не неявно через ссылки.
Так и сделаю, пожалуй.
Цитата Сообщение от DrOffset Посмотреть сообщение
Смотри справку по regex_search и smatch, а то это просто ужас
Сейчас посмотрю.
0
Эксперт С++
8274 / 3850 / 837
Регистрация: 15.11.2014
Сообщений: 8,726
22.08.2016, 17:19 15
Цитата Сообщение от GbaLog- Посмотреть сообщение
Типа через std::basic_string<T>
ага

Цитата Сообщение от GbaLog- Посмотреть сообщение
Разве что заменить в коде все объявления std::string на std::basic_string<T> и std::basic_fstream<T>, но это геморрой ещё тот.
жизнь - боль и страдания.

ваша текущая версия ещё гемморней.

Цитата Сообщение от GbaLog- Посмотреть сообщение
Мне важно, чтобы сохранялся порядок переменных, потому что в них могут присутствовать комментарии, а std::unordered_map не гарантирует того, что порядок останется таким, каким и был.
понятна.
1
Любитель чаепитий
3509 / 1623 / 504
Регистрация: 24.08.2014
Сообщений: 5,545
Записей в блоге: 1
22.08.2016, 17:36  [ТС] 16
Цитата Сообщение от DrOffset Посмотреть сообщение
Смотри справку по regex_search и smatch, а то это просто ужас
Но место ты нашел правильно. Пофиксил только неправильно, от UB не защитился.
В общем по std::smatch единственное, что нашёл, так это то, что я не проверяю match_var на готовность, то есть:
C++
1
2
if( match_var.ready() )
{ ... }
А что не так с std::regex_search() я так и не понял, может с регуляркой что не так?

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
ну клевые же титьки получились
Фу, как некультурно. :stop:


Цитата Сообщение от hoggy Посмотреть сообщение
ваша текущая версия ещё гемморней.
Ну ладно. Хотя я согласен.
0
13692 / 7320 / 1746
Регистрация: 30.01.2014
Сообщений: 12,261
22.08.2016, 18:04 17
Цитата Сообщение от GbaLog- Посмотреть сообщение
А что не так с std::regex_search() я так и не понял
Returns true if a match exists, false otherwise. In either case, the object m is updated, as follows
Иными словами, try-catch вообще не в кассу.
0
Любитель чаепитий
3509 / 1623 / 504
Регистрация: 24.08.2014
Сообщений: 5,545
Записей в блоге: 1
22.08.2016, 18:11  [ТС] 18
DrOffset, Странно, а ведь я уже начал было писать if( std::regex_search... , но почему-то передумал. Да и как я уже говорил, у меня с английским туго, неправильно перевел я это, наверное. А даже если и правильно, то вряд ли это натолкнуло бы меня на мысль, что там что-то не так.
0
13692 / 7320 / 1746
Регистрация: 30.01.2014
Сообщений: 12,261
22.08.2016, 18:18 19
Цитата Сообщение от GbaLog- Посмотреть сообщение
у меня с английским туго
Есть вот такой вариант в этом случае: http://www.williamspublishing.... 837-6.html
0
Любитель чаепитий
3509 / 1623 / 504
Регистрация: 24.08.2014
Сообщений: 5,545
Записей в блоге: 1
22.08.2016, 18:24  [ТС] 20
Цитата Сообщение от DrOffset Посмотреть сообщение
Есть вот такой вариант в этом случае
Я её всю прочитал, кроме разделов про потоки и локализацию.

И я даже знал, что std::regex_search возвращает bool, но забыл, зачем надо это проверять.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.08.2016, 18:24

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Шаблон класса (параметризация класса)
Нужна помощь и советы!!! Англо-русский словарь построен как список. Каждая компонента содержит...

Создать шаблон некоторого класса, возможно, реализованного с применением некоторого серверного класса
Добрый день, Уважаемые профессионалы. Прошу помочь в решении задачи. Честно говоря, я ничего...

Шаблон класса
Привет всем! Решил написать программу с шаблонами. Вот 3 файла: //tree.h #pragma once ...

Шаблон класса
Приветствую. Есть глупый вопрос. Имеется класс: #pragma once #include &quot;support.hpp&quot; ...


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

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

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