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

Сообщение type converter от 26.09.2018 9:52

Изменено 26.09.2018 9:55 SomeOne_TT

type converter
Есть три внешние иерархии типов, которые надо маппить друг в друга.

Первая иерархия построена на enum-like int

namespace ns_val
{
    int APPLE = 0
    int PINEAPPLE = 1
    int PEAR = 2
}

Вторая — классические типы
namespace ns_types
{
    struct Apple
    struct Pineapple
    struct Pear
}


Третья — весьма странный (не понимаю, зачем?) способ

namespace ns_crap
{
struct Fruit:Base_Fruit
{
 public:
    static const Fruit& Apple;
    static const Fruit& Pineapple;
    static const Fruit& Pear;
}
}


Задача — написать конвертер, который маппит значение из одной иерархии в другую.
Желаемый интерфейс — что-то вроде

template <...>
struct Mapping
{
    using type = T;
    int   val;
    Fruit obj;
    
}

from_val<ns_val::APPLE>()::type|obj
from_type<ns_types::Pear>()::obj|val
from_crap<ns_crap::Fruit::Pineapple>::type|val



Что ни придумаю — выходят какие-то уродцы, да еще и ns_crap::Fruit как темплейт аргумент применить невозможно, т.к. это не тип и не значение.
Какие есть варианты?
type converter
Есть три внешние иерархии типов, которые надо маппить друг в друга.

Первая иерархия построена на enum-like int

namespace ns_val
{
    int APPLE = 0
    int PINEAPPLE = 1
    int PEAR = 2
}

Вторая — классические типы
namespace ns_types
{
    struct Apple
    struct Pineapple
    struct Pear
}


Третья — весьма странный (не понимаю, зачем?) способ

namespace ns_crap
{
struct Fruit:Base_Fruit
{
 public:
    static const Fruit& Apple;
    static const Fruit& Pineapple;
    static const Fruit& Pear;
}
}


Задача — написать конвертер, который маппит значение из одной иерархии в другую.
Желаемый интерфейс — что-то вроде

template <...>
struct Mapping
{
    using type = T;
    int   val;
    Fruit obj;
    
}

from_val<ns_val::APPLE>()::type|obj
from_type<ns_types::Pear>()::obj|val
from_crap<ns_crap::Fruit::Pineapple>()::type|val



Что ни придумаю — выходят какие-то уродцы, да еще и ns_crap::Fruit как темплейт аргумент применить невозможно, т.к. это не тип и не значение.
Какие есть варианты?