Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
1

Свой TypeInfo и регистрация типов

18.08.2020, 22:31. Показов 2150. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Допустим есть такой код:
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
#include <iostream>
#include <string>
#include <functional>
//------------------------------------------------------------------------------
template<typename T>
class TypeInfo
{
    public:
       static const std::string typeName;
       
       using  FromStringFunction= T(*)(const std::string&);
       static const FromStringFunction fromString;
};
//------------------------------------------------------------------------------
#define TI_REGISTER_TYPE(TYPE,TYPE_NAME,FROM_STRING) \
    template<> const std::string TypeInfo<TYPE>::typeName= TYPE_NAME; \
    template<> const TypeInfo<TYPE>::FromStringFunction TypeInfo<TYPE>::fromString= FROM_STRING;
//------------------------------------------------------------------------------
TI_REGISTER_TYPE(int,"int",  [](auto s){ return std::stoi(s); } )
TI_REGISTER_TYPE(std::string, "string", [](auto s){ return s; } )
TI_REGISTER_TYPE(float,"float", [](auto s){ return std::stof(s); } )
//------------------------------------------------------------------------------
#undef TI_REGISTER_TYPE
//------------------------------------------------------------------------------
 
 
int main()
{
    std::cout << TypeInfo<int>().typeName << std::endl;
    std::cout << TypeInfo<std::string>().fromString("123") << std::endl;
    std::cout << TypeInfo<float>().fromString("12.3") << std::endl;
    
    /* Хочеться  иметь следующее: */
    // std::cout << std::boolalpha << TypeInfo<long long>().isRegistred  << std::endl;
 
    return 0;
}
Обеспечивающий регистрацию типа и связывает с ним заданное имя и заданную ф-ции конвертацию из строки.
Есть ли какой-то прием позволяющий в компил тайме определить зарегистрирован ли тип или нет?
Или я выбрал изначально неправильный подход?

Нужно это для проверки типа в шаблоне:
C++
1
2
3
4
5
6
7
template<typename T>
class Test
{
       static_assert(!TypeInfo<T>().isRegistred,"Недопустимый тип!");
      
      // ...
};
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.08.2020, 22:31
Ответы с готовыми решениями:

Регистрация типов файлов
Нашел в факью факи Там написано нужно зарегистрировать. Можете сказать где это прописывать нужно...

Свой софт: Регистрация, Защита от взлома
Привет всем еще раз:) Поделитесь, pls, опытом защиты своих шароваровых творений. В смысле...

Регистрация на чужом сайте через свой сайт
Здравствуйте. Вопрос такой. Как сделать регистрацию на чужом сайте, через свой? То есть я со...

Создать свой собственный обработчик исключительной ситуации для ошибки преобразования типов
помогите пожалуйста! нужно создать свой собственный обработчик исключительной ситуации (блок) для...

7
18841 / 9840 / 2408
Регистрация: 30.01.2014
Сообщений: 17,281
18.08.2020, 23:01 2
Лучший ответ Сообщение было отмечено Avazart как решение

Решение

Avazart, так?

Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <string>
#include <functional>
//------------------------------------------------------------------------------
template<typename T>
class TypeInfo
{
    public:
       static const std::string typeName;
       
       using  FromStringFunction= T(*)(const std::string&);
       static const FromStringFunction fromString;
    
       static const bool isRegistered;
};
//------------------------------------------------------------------------------
template<typename T>
const bool TypeInfo<T>::isRegistered = false;
//------------------------------------------------------------------------------
#define TI_REGISTER_TYPE(TYPE,TYPE_NAME,FROM_STRING) \
    template<> const std::string TypeInfo<TYPE>::typeName= TYPE_NAME; \
    template<> const TypeInfo<TYPE>::FromStringFunction TypeInfo<TYPE>::fromString= FROM_STRING; \
    template<> const bool TypeInfo<TYPE>::isRegistered = true;
//------------------------------------------------------------------------------
TI_REGISTER_TYPE(int,"int",  [](auto s){ return std::stoi(s); } )
TI_REGISTER_TYPE(std::string, "string", [](auto s){ return s; } )
TI_REGISTER_TYPE(float,"float", [](auto s){ return std::stof(s); } )
//------------------------------------------------------------------------------
#undef TI_REGISTER_TYPE
//------------------------------------------------------------------------------
 
int main()
{
    std::cout << TypeInfo<int>().typeName << std::endl;
    std::cout << TypeInfo<std::string>().fromString("123") << std::endl;
    std::cout << TypeInfo<float>().fromString("12.3") << std::endl;
    
    /* Хочеться  иметь следующее: */
    std::cout << std::boolalpha << TypeInfo<long long>().isRegistered  << std::endl;
    std::cout << std::boolalpha << TypeInfo<float>().isRegistered  << std::endl;
 
    return 0;
}
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
18.08.2020, 23:12  [ТС] 3
Блин, а ларчик открывался просто хотя и не очевидно.
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
19.08.2020, 11:45 4
Цитата Сообщение от DrOffset Посмотреть сообщение
Avazart, так?
А зачем там использовать указатель на функцию, т.е. по сути виртуальный метод, если мы вызываем метод конкретного класса?
Не лучше сделать вот так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template<typename T>
struct TypeInfo: std::false_type {};
 
#define TI_REGISTER_TYPE(type, from_string_func) \
    template <> struct TypeInfo<type>: std::true_type { \
        template <typename T> type fromString(T &&s) {return (from_string_func)(std::forward<T>(s));} \
        const char * const m_name = #type; \
    }
 
//------------------------------------------------------------------------------
TI_REGISTER_TYPE(int, std::stoi);
TI_REGISTER_TYPE(std::string, [](auto s){ return s; } );
TI_REGISTER_TYPE(float, std::stof);
1
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.08.2020, 13:22  [ТС] 5
Я честно говоря не понимаю разницу.

C++
1
2
3
4
template <typename T> type fromString(T &&s) 
{
     return (from_string_func)(std::forward<T>(s));
}
Я тут не понимаю что происходит.

Добавлено через 5 минут
В fromString должна передаваться строка.
0
18841 / 9840 / 2408
Регистрация: 30.01.2014
Сообщений: 17,281
19.08.2020, 13:42 6
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
А зачем там использовать указатель на функцию, т.е. по сути виртуальный метод, если мы вызываем метод конкретного класса?
Почему ты у меня это спрашиваешь?

Добавлено через 2 минуты
ТС дал код, я в контексте этого кода и заданного вопроса внес исправления.
Архитектурные принципы заданы ТС`ом. Нафига у меня спрашивать о причинах их появления?
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.08.2020, 13:43  [ТС] 7
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
А зачем там использовать указатель на функцию, т.е. по сути виртуальный метод, если мы вызываем метод конкретного класса?
Не лучше сделать вот так?
В принципе да, так лучше.
Хотя конечно std::false_type/std::true_type не очень ожидаемо.
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
19.08.2020, 14:34 8
Цитата Сообщение от DrOffset Посмотреть сообщение
Почему ты у меня это спрашиваешь?
Цитата Сообщение от DrOffset Посмотреть сообщение
Архитектурные принципы заданы ТС`ом. Нафига у меня спрашивать о причинах их появления?
Очевидно, потому что я не читал первое сообщение, как обычно - заголовок и последнее сообщение.
0
19.08.2020, 14:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.08.2020, 14:34
Помогаю со студенческими работами здесь

Можно ли создать свой перегруженный вариант функций, для разных типов потока
Доброго времени суток. Хотелось бы задать несколько вопросов, ответы на которые мне не удалось...

#include <typeinfo>, что такое typeid()
Добрый день. Объясните пожалуйста, как работает typeid()? 1. Я читал, что бывает так...

Чтение и запись типов, массив типов и List<> данных в файл
Здравствуйте Подскажите способ записи и чтения любых типов данных (не компонентов) Например это: ...

Как посадить свой домен на свой сайт, который на домашнем компе?
У меня статический ip. на картинке видно что сейчас в настройках, в качестве записи A указал...

Как установить свой текст подсказки при наведении на свой контрол?
Как установить свой текст подсказки при наведении на свой контрол?

Свой компонент от ListBox. Не могу задать свой тип для Items
День добрый господа. Нуждаюсь в вашей помощи. Суть такова, что я желаю создать свой компонент на...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru