Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30

Шаблоны и исключения

28.07.2020, 13:04. Показов 1829. Ответов 39
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Допустим есть код нечто вроде следующего:
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
template<typename CharT>
class Object
{
    public:
       using String = std::basic_string<CharT>;
   
       const  String& name()const; 
 
     // ...
};
 
template<typename CharT>
class Parser
{
    public:
        using String = std::basic_string<CharT>;
 
        void parse(const String&  str)
        {
            // тут что-то делаем и что-то идет не так, логично бросить исключение
               throw ParserException( "Дела плохи с объектом '"+object.name()+"'");
               /* но ParserException не буде работать при wchar_t  !!! */
 
        }
  
    private:
       std::vector<Object<CharT>> objects_;
};
Вся проблема в методе parse(). Думаю понятно что подразумевается использование класса либо с char либо wchar_t
(и по хорошему наверное должно работать и с иными вариациями) и возникает вопрос как бросать вразумительные исключения учитывая char/wchar_t?

1. Очевидно что делать исключение тоже шаблонным будет плохо главным образом потому что не очевидно для пользователя.
2. Конвертировать строки значит привязываться кодировкам (системе или библиотеки) и не понятно какие будут тут нюансы.
3. Я вижу только один выход уходить от исключений использовать возврат значения с методом возвращающим описание, примерно как в Qt.

Есть другие варианты?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.07.2020, 13:04
Ответы с готовыми решениями:

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

Организация собственного исключения и передача в него исходного исключения
Для обработки исключений при работе с БД я создал собственное исключение: public class SQLEntityException : ApplicationException ...

Хранить шаблоны документов в базе и выводить данные в эти шаблоны
Доброго времени суток. Интересует вопрос: мне необходимо формировать вордовские документы по шаблону. У меня создан шаблон документа...

39
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
29.07.2020, 00:55
Студворк — интернет-сервис помощи студентам
Может я не понял в чем суть. Но в качестве размышлений на тему (корявых, но как идея).
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
#include <iostream>
using namespace std;
 
template <class T>struct Prn
{
 
};
 
template <>struct Prn<char *>
{
   void operator()(const char* str){cout<<str;}
};
 
template <>struct Prn<wchar_t *>
{
   void operator()(const wchar_t* wstr){wcout<<wstr;}
};
 
template <class T>struct PerseException
{
    PerseException(T wtf_):wtf(wtf_){}
    T  wtf ;
    void print_ex(){Prn<T>()(wtf);};
};
 
 
template <class T> struct Parser
{
 
    void parse(T  str)
    {
        throw PerseException<T>(str);
    }
 
    void DoThings(const T str)
    {
        try{
                parse(str);
           }
 
        catch(PerseException<T> &pex)
            {
               pex.print_ex();
            }
    }
};
 
int main()
{
Parser<char*> wtf;
wtf.DoThings("wtf");
cout<<endl;
Parser<wchar_t*> wtf_t;
wtf_t.DoThings(L"wtf");
return 0;
Добавлено через 52 минуты
То же не шибко красиво, но сам класс исключений уже не шаблонный:
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
#include <iostream>
using namespace std;
 
template <class T>struct Prn
{
 
};
 
template <>struct Prn<char *>
{
   void operator()(const char* str){cout<<str;}
};
 
template <>struct Prn<wchar_t *>
{
   void operator()(const wchar_t* wstr){wcout<<wstr;}
};
 
struct ParseExceptArgBase
{
    virtual void print_ex()=0;
};
 
template <class T>struct ParseExceptArg : public ParseExceptArgBase
{
    ParseExceptArg(T wtf_):wtf(wtf_){}
    T  wtf ;
    void print_ex(){Prn<T>()(wtf);};
};
 
struct PerseException
{
    ParseExceptArgBase *peb;
    PerseException(ParseExceptArgBase *peb_)
    :peb(peb_)
    {
 
    }
    void wtf(){peb->print_ex();}
 
};
 
template <class T> struct Parser
{
 
    void parse(T  str)
    {
        ParseExceptArg<T> *parg=new ParseExceptArg<T>(str);
        throw PerseException(parg);
    }
 
    void DoThings(const T str)
    {
        try{
                parse(str);
           }
 
        catch(PerseException &pex)
            {
               pex.wtf();
            }
    }
};
 
int main()
{
Parser<char*> wtf;
wtf.DoThings("wtf");
cout<<endl;
Parser<wchar_t*> wtf_t;
wtf_t.DoThings(L"wtf");
return 0;
}
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.07.2020, 11:46  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
конвертерами будет ужиматься.
В utf-8 ? Как бы наверное это не очень хорошо если пользователь работает с wchar возвращать ему ошибку в char еще и в многобайтовой кодировке.Да к примеру под виндой вообще может быть cp1251.

Добавлено через 1 минуту
IGPIGP, А ничего что вывод ошибки зашит на сout ?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
29.07.2020, 13:22
Цитата Сообщение от Avazart Посмотреть сообщение
GPIGP, А ничего что вывод ошибки зашит на сout ?
Avazart, вы можете использовать cerr или 3-d party lib не имеет значения. Я показал логику по которой вы можете работать с такой строкой которая вас устраивает. Исключения могут быть и внешними и тип будет нешаблонен:
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
#include <iostream>
using namespace std;
 
template <class T>struct Prn
{
 
};
 
template <>struct Prn<char *>
{
   void operator()(const char* str){cout<<str;}
};
 
template <>struct Prn<wchar_t *>
{
   void operator()(const wchar_t* wstr){wcout<<wstr;}
};
 
struct ParseExceptArgBase
{
    virtual void print_ex()=0;
};
 
template <class T>struct ParseExceptArg : public ParseExceptArgBase
{
    ParseExceptArg(T wtf_):wtf(wtf_){}
    T  wtf ;
    void print_ex(){Prn<T>()(wtf);};
};
 
struct PerseException
{
    ParseExceptArgBase *peb;
    PerseException(ParseExceptArgBase *peb_)
    :peb(peb_)
    {
 
    }
    void wtf(){peb->print_ex();}
 
};
 
template <class T> struct Parser
{
 
    void parse(T  str)
    {
        ParseExceptArg<T> *parg=new ParseExceptArg<T>(str);
        throw PerseException(parg);
    }
 
    void DoThings(const T str)
    {
        try{
                parse(str);
           }
 
        catch(PerseException &pex)
            {
               pex.wtf();
            }
    }
};
 
 
int main()
{
Parser<char*> wtf;
wtf.DoThings("wtf");
cout<<endl;
try{
wtf.parse("wtf");
}
catch(PerseException &pex)
            {
               pex.wtf();
            }
cout<<endl;
Parser<wchar_t*> wtf_t;
wtf_t.DoThings(L"wtf");
cout<<endl;
try{
wtf_t.parse(L"wtf");
}
catch(PerseException &pex)
            {
               pex.wtf();
            }
return 0;
}
Ваш изначальный вопрос о уровне типов (представлений/форматов/размеров/допустимых операций/функций). Код это решает. Не уверен, что хорошо, даже по идее. Может кто-то получше предложит идею. А реализация это ваше. Функции выбирайте сами. Этого в вопросе не было, по его сути.

Добавлено через 1 час 29 минут
Ну и в конце концов сами std::cerr и std::wcerr тоже работают на разных типах символов.
https://en.cppreference.com/w/cpp/io/cerr
То есть, в предложенном подходе оно отражено.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
29.07.2020, 13:32
Цитата Сообщение от Avazart Посмотреть сообщение
Да к примеру под виндой вообще может быть cp1251.
может.
а к примеру под китайской виндой может быть какая нибудь GB-18030
и вот как ты весь этот зооопарк теперь собираешься разруливать?

а теперь представь себе: я даю тебе готовый lib или dll.
и ты знаешь: what() всегда возвращает utf-8.
и тебе уже не важно кто именно собирал эту библиотку: араб, китаец, или русский.
юникод специально для того и придумали, что бы жизнь людей стала проще.


зы:
зачем вообще локализировать описание ошибок ?
сами же себе гемморой на задницу придумываете.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.07.2020, 14:07  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
зачем вообще локализировать описание ошибок ?
Что бы описание было вменяемым. Я же сказал что сама ошибка на английском но вот к примеру имя объекта может быть на другом языке.

Цитата Сообщение от hoggy Посмотреть сообщение
всегда возвращает utf-8.
Проблема лишь в то что именно с utf-8 невозможно работать по символьно.

Добавлено через 1 минуту
Цитата Сообщение от hoggy Посмотреть сообщение
а к примеру под китайской виндой может быть какая нибудь GB-18030
И в идеале с этим не должно быть проблемой.

Добавлено через 1 минуту
Цитата Сообщение от IGPIGP Посмотреть сообщение
Avazart, вы можете использовать cerr или 3-d party lib не имеет значения. Я показал логику по которой вы можете работать с такой строкой которая вас устраивает. Исключения могут быть и внешними и тип будет нешаблонен:
Нужна строка, а не то что предложено Вами. Приложения бывают не только консольные.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
29.07.2020, 14:20
Цитата Сообщение от Avazart Посмотреть сообщение
Я же сказал что сама ошибка на английском но вот к примеру имя объекта может быть на другом языке.
ну и нафиг нужны такие имена объектов?

такое впечатление начинает складываться, что ты решаешь какую то XY-проблему.

Цитата Сообщение от Avazart Посмотреть сообщение
Проблема лишь в то что именно с utf-8 невозможно работать по символьно.
ну а это то нафига вообще может быть нужно ???

приведи хоть один пример, зачем это может быть нужно ?

Цитата Сообщение от Avazart Посмотреть сообщение
И в идеале с этим не должно быть проблемой.
нет, чувак. это именно самая, что ни на есть, настоящая проблема.
в нашем реальном и не-идеальном мире.

ты походу не уловил ситуацию:
тебе на руки дали dll.
и хрен его знает какая там была кодировка - на машине, где эта dll была собрана.

и вот в какой кодировке она тебе возвращает результат ?
может быть cp1251, а может быть GB-18030

а может быть одна dll работает с cp1251, а другая - с GB-18030
а тебе мудохаццо теперь со всем этим зоопарком.

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

юникод был разработан специально для решения этой проблемы.
если чо.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.07.2020, 16:07  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
ну и нафиг нужны такие имена объектов?
А почему нет?

Добавлено через 59 секунд
Цитата Сообщение от hoggy Посмотреть сообщение
ну а это то нафига вообще может быть нужно ???
приведи хоть один пример, зачем это может быть нужно ?
Замена символов? Сплитирование ? Да что угодно.

Добавлено через 2 минуты
Цитата Сообщение от hoggy Посмотреть сообщение
такое впечатление начинает складываться, что ты решаешь какую то XY-проблему.
Проблема вылезла когда я решил попробовать написать аналог ArgumentParser из Python, вот почему ключ или значение консольного параметра должно быть именно латиницей? И обязательно в какой-то конкретной кодировке?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
29.07.2020, 16:34
Цитата Сообщение от Avazart Посмотреть сообщение
Нужна строка, а не то что предложено Вами. Приложения бывают не только консольные.
Тогда скажите детальнее. Вы изначально спросили о не шаблонном классе исключения для методов шаблонного класса. А теперь нужен объект связанный с параметром шаблона... Или как вы это понимаете? Изложите чётко и будет виднее, что делать. Вам в первую очередь. Да и я подумаю. Как вы сами понимаете, если вы хотите сериализованный в байт цепочку массив, то задача другая чем она видна сейчас. Впрочем, - объясните детальнее, что вы хотите получить.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.07.2020, 17:01  [ТС]
Почти все изложено в первом посте, читайте внимательнее.

Добавлено через 1 минуту
Цитата Сообщение от IGPIGP Посмотреть сообщение
А теперь нужен объект связанный с параметром шаблона...
Он изначально был связан:
Цитата Сообщение от Avazart Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
template<typename CharT> /*  CharT !!! */
class Object
{
    public:
       using String = std::basic_string<CharT>;
   
       const  String& name()const; 
 
     // ...
};
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
29.07.2020, 17:06
Цитата Сообщение от Avazart Посмотреть сообщение
Замена символов? Сплитирование ? Да что угодно.
нафига???

ты осознаешь что речь идет о выводе текста эксепшена?

C++
1
2
3
4
catch(const std::exception& e)
{
    std::cerr << e.what(); // что ты тут сплиттировать собрался?
}
Цитата Сообщение от hoggy Посмотреть сообщение
приведи хоть один пример, зачем это может быть нужно ?
я так понял, примера не будет?

Цитата Сообщение от Avazart Посмотреть сообщение
вот почему ключ или значение консольного параметра должно быть именно латиницей?
любители русских букв в параметрах запускаемого процесса должны страдать.

Цитата Сообщение от Avazart Посмотреть сообщение
И обязательно в какой-то конкретной кодировке?
в реальном мире текст всегда хранится в какой то конкретной кодировке.
собственно, именно по этой причине и страдают любители национальных символов в аргументах командной строки.

в какой именно кодировке задан текст командной строки?
это зависит от конкретной платформы.

нормальные люди делают просто:
на конкретной платформе известно в какой кодировке задан текст аргументов командной строки
они берут этот текст, и зная в какой он кодировке, перегоняют его в юникод (обычно это utf-8).
функция конвертации пишется под ключ конкретной платформы (реализация не кросс-платформенная)

а вот весь остальной проект уже работает с юникодом (utf-8),
и никак не зависит от настроек локали.



в твоём случае можно взять аргументы командной строки,
и перегнать их в utf-8.

сам парсер работает с utf-8, и не зависит ни от кодовой страницы Windows,
ни от Windows вообще.

ты, конечно, можешь прибиться гвоздями к cp1251.
но тогда твоим софтом будут пользоваться только русские пользователи русско-язычной винды.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.07.2020, 17:07  [ТС]
Может дополнить код так что бы стало понятным

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
template<typename CharT>
class Parser
{
    public:
        using String = std::basic_string<CharT>;
 
        void parse(const String&  str)
        {
            // ...
            Object<CharT> object;
            // ...
            object= str.substr(/ *... */)   /* имя какая то часть из строки */
 
            // тут что-то делаем и что-то идет не так, логично бросить исключение
   
            throw ParserException( "Дела плохи с объектом '"+object.name()+"'");
               /* но ParserException не буде работать при wchar_t  !!! */
 
        }
  
    private:
       std::vector<Object<CharT>> objects_;
};
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
29.07.2020, 17:08
Цитата Сообщение от Avazart Посмотреть сообщение
Он изначально был связан:
И как вы собираетесь передать шаблон класса в catch ?
Avazart, мы же знаем что throw это такой себе return где вы можете вернуть разные типы. Но если пытаться вернуть шаблон, то ловить придётся инстансы? То есть, придётся написать столько кэтчей сколько интсансов вы потенциально можете бросить?
В принципе, я даже хочу попробовать. Но боюсь, счастья это не прибавит. Я не уверен что можно кинуть не шаблонный объект в котором лежит шаблонный тип.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.07.2020, 17:17  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
// что ты тут сплиттировать собрался?
Переносы строк/пробелы?

Добавлено через 1 минуту
Цитата Сообщение от IGPIGP Посмотреть сообщение
И как вы собираетесь передать шаблон класса в catch ?
Что? Техническом языком можно?

Добавлено через 6 минут
См. п.1
IGPIGP,
Цитата Сообщение от Avazart Посмотреть сообщение
1. Очевидно что делать исключение тоже шаблонным будет плохо главным образом потому что не очевидно для пользователя.
Не очевидно что ловить:
Цитата Сообщение от Avazart Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
Parser<wchar_t> parser;
try
{
 parser.parse(L"бла-бла");
}
catch(const ParserError<char>& e) /* А у нас wchar_t !!! */
{
 // ..
}
Поэтому шаблон исключения плохой вариант и был отметен сразу.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
29.07.2020, 17:20
Цитата Сообщение от Avazart Посмотреть сообщение
Переносы строк/пробелы?
ты можешь ответить на очень простой конкретный вопрос: нафига?

вот нахера тебе это нужно?

вот я беру и просто логгирую весь текст "как есть"

C++
1
2
3
4
catch(const std::exception& e)
{
    std::cerr << e.what(); // какая тебе разница где именно там расставлены пробелы?
}

Цитата Сообщение от Avazart Посмотреть сообщение
Может дополнить код так что бы стало понятным
C++
1
2
// object.name() возвращает юникод
throw ParserException( "invalid object: '", object.name(), "'");
если там английский текст, то ascii будет не отличим от utf-8
если там не только английский текст, тогда utf-8 его корректно воспримет,
но все равно не понятно - нафиг нужно национальное имя включать в диагностику эксепшена?


ты в сосстоянии внятно сформулировать какую проблему ты пытаешься решить?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.07.2020, 17:22  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
если там английский текст,
Англ. текст это про "invalid object: '", а в object.name() может быть что угодно.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
29.07.2020, 17:22
Цитата Сообщение от Avazart Посмотреть сообщение
Что? Техническом языком можно?
catch это фрагмент кода оформленный в виде оператора схожего на функцию. У него нет типа возврата, но есть объявляемый параметр куда принимается передаваемый аргумент. Операторы catch ожидают свой тип аргумента так как будто есть перегруженные функции - по типу аргумента. И главное - catch не бывает шаблонным. Это я хотел сказать.
В коде вы сами показали объявление инстанса на типе char и это вполне конкретный тип. И это путь - "Многие инстансы, - многие кэтчи". Это реализуемо. В чём вопрос всё равно не ясно.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.07.2020, 17:24  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
ты в сосстоянии внятно сформулировать какую проблему ты пытаешься решить?
Уже:
Цитата Сообщение от Avazart Посмотреть сообщение
Проблема вылезла когда я решил попробовать написать аналог ArgumentParser из Python, вот почему ключ или значение консольного параметра должно быть именно латиницей? И обязательно в какой-то конкретной кодировке?
Добавлено через 1 минуту
Цитата Сообщение от IGPIGP Посмотреть сообщение
catch это фрагмент кода оформленный в виде оператора схожего на функцию. У него нет типа возврата, но есть объявляемый параметр куда принимается передаваемый аргумент. Операторы catch ожидают свой тип аргумента так как будто есть перегруженные функции - пор типу аргумента. И главное - catch не бывает шаблонным. Это я хотел сказать.
К чему это ?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
29.07.2020, 17:40
Цитата Сообщение от Avazart Посмотреть сообщение
К чему это ?
К
Цитата Сообщение от Avazart Посмотреть сообщение
Что? Техническом языком можно?
на моё
Цитата Сообщение от IGPIGP Посмотреть сообщение
И как вы собираетесь передать шаблон класса в catch ?
пришлось объяснять что значит передать аргумент в catch. Я старался как мог.
И вот ещё что. У catch нет типа возврата не спроста. Он нужен для обработки внутри ситуации когда всё не хорошо. Оттуда впринципе можно попытаться логировать даже в файл но нет гарантии что даже std::log/wlog поймает всё в буфер. Вот почему не понятно зачем где-то объект инстанса отлавливать. Но можно в принципе, если я верно понял. Два catch один за другим. Один пытается ловить String<char> а другой String<wchar_t>, но что это вам даст? Если логика разная то может и нужны разные обработчики. Я написал схему которой всё равно. Там и логику можно ветвить, но без юзера. Хотя при желании ему можно предложить переопределить какой-то метод который изначально ничего не делает и вызывается в обработчике там где нужно по-разному отхепибёрздить...
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.07.2020, 22:08  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
Я старался как мог.
Советую самому немного разобраться с тем что такое исключения что бы не было таких пустых объяснений не к селу ни к городу.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
30.07.2020, 00:06
Цитата Сообщение от Avazart Посмотреть сообщение
Советую самому немного разобраться с тем что такое исключения что бы не было таких пустых объяснений не к селу ни к городу.
Как скажете. Буду с интересом наблюдать развитие темы. Пока не понял, что вам нужно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.07.2020, 00:06

Чем отличаются шаблоны HTML и шаблоны WordPress
В чём различие между шаблонами HTML и WordPress. Кроме того, что создаются они разными способами. Конкретно имею в виду, почему их...

«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами».
«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». Есть ли разница в этих понятиях? Если есть, то в чём? И где (в каких...

Шаблоны. Плохо понимаемые моменты из книги "Шаблоны С++. Справочник разработчика". (Вандевурд, Джосаттис)
Так как изучаю эту книгу, то в некоторых местах возникают вопросы. Чтобы не плодить много тем, корни у которых одни, решил создать эту...

Помогите писать на С++ через шаблоны. Консуле я писал, но надо писать исползуя шаблоны
В одномерном массиве, состоящем из п вещественных элементов, вычислить: 1) количество элементов массива, равных 0; 2) сумму элементов...

Исключения
Проверить входной файл на то, правильно ли в нём использованы многострочные комментарии/* */. Я не поняла. Можете мне объяснить, как это...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru