Информация об изменениях

Сообщение Re: Вопрос по идентификации типа (не RTTI) от 07.04.2019 5:39

Изменено 07.04.2019 5:59 rg45

Re: Вопрос по идентификации типа (не RTTI)
Здравствуйте, niralex, Вы писали:

N>Есть некий конечный набор пользовательских типов и задача их идентифицировать во время выполнения не используя RTTI.

N>Для не шаблонных типов это может выглядеть так:

N>using TypeId = const char *;

N>struct MyType1{
N> static constexpr TypeId Id(){
N> return "1";
N> }
N>};
N>struct MyType2{
N> static constexpr TypeId Id(){
N> return "2";
N> }
N>};


N>А как быть с шаблонными типами при условии чтобы функция MyType3::Id() оставалась constexpr


N>template<typename T>

N>struct MyType3 {
N> static constexpr TypeId Id(){
N> // return ?
N> }
N>};


N>Тип идентификатора TypeId не важен. Варианты без constexpr известны.


Можно вынести идентификацию типов за пределы классов. Это позволит присвоить идентификаторы не только пользовательским типам, но и встроенным. После чего идентификаторы можно будет пробовать как-то комбинировать:

template <typename> struct TypeID;

template<> struct TypeID<int> : std::integral_constant<int, 1> { };
template<> struct TypeID<std::string> : std::integral_constant<int, 2> { };
template<> struct TypeID<MyType1> : std::integral_constant<int, 3> { };
template<> struct TypeID<MyType2> : std::integral_constant<int, 4> { };

template <typename T>
struct TypeID<MyType3<T>> : std::integral_constant<int, 420000 + TypeID<T>::value> {};
Re: Вопрос по идентификации типа (не RTTI)
Здравствуйте, niralex, Вы писали:

N>Есть некий конечный набор пользовательских типов и задача их идентифицировать во время выполнения не используя RTTI.

N>Для не шаблонных типов это может выглядеть так:

N>using TypeId = const char *;

N>struct MyType1{
N> static constexpr TypeId Id(){
N> return "1";
N> }
N>};
N>struct MyType2{
N> static constexpr TypeId Id(){
N> return "2";
N> }
N>};


N>А как быть с шаблонными типами при условии чтобы функция MyType3::Id() оставалась constexpr


N>template<typename T>

N>struct MyType3 {
N> static constexpr TypeId Id(){
N> // return ?
N> }
N>};


N>Тип идентификатора TypeId не важен. Варианты без constexpr известны.


Можно вынести идентификацию типов за пределы классов. Это позволит присвоить идентификаторы не только пользовательским типам, но и встроенным. После чего идентификаторы можно будет пробовать как-то комбинировать:

template <typename> struct TypeID;

template<> struct TypeID<int> : std::integral_constant<int, 1> { };
template<> struct TypeID<std::string> : std::integral_constant<int, 2> { };
template<> struct TypeID<MyType1> : std::integral_constant<int, 3> { };
template<> struct TypeID<MyType2> : std::integral_constant<int, 4> { };

template <typename T>
struct TypeID<MyType3<T>> : std::integral_constant<int, 420000 + TypeID<T>::value> {};


P.S. Синтаксический сахар и диагностику можно добавить во вкусу.