Сообщение 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 известны.
Можно вынести идентификацию типов за пределы классов. Это позволит присвоить идентификаторы не только пользовательским типам, но и встроенным. После чего идентификаторы можно будет пробовать как-то комбинировать:
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 известны.
Можно вынести идентификацию типов за пределы классов. Это позволит присвоить идентификаторы не только пользовательским типам, но и встроенным. После чего идентификаторы можно будет пробовать как-то комбинировать:
P.S. Синтаксический сахар и диагностику можно добавить во вкусу.
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. Синтаксический сахар и диагностику можно добавить во вкусу.