Задача — написать конвертер, который маппит значение из одной иерархии в другую.
Желаемый интерфейс — что-то вроде
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 как темплейт аргумент применить невозможно, т.к. это не тип и не значение.
Какие есть варианты?
Здравствуйте, Alexander G, Вы писали:
AG>Можно. Это переменная с внешним связыванием, можно параметризовать шаблон указателем на неё
AG>template<ns_crap::Fruit*> AG>...
[code] C>strcut OnError C>{ C> static const OnError& Default; // может совпадать с одной из определенных выше переменных. И вообще определяться в run-time. C>};
[/ccode]
C>При этом, в run-time могут гулять не только эти две реализации...
Понятно, спасибо.
C>Конвертер точно должен быть compile-time, а не run-time? C>Просто использование указателей на ns_crap::Fruit compile-time очень ограниченно.
Да, некоторые направления конвертирования возможны только в рантайме, но и они нужны.
Сейчас все реализовано через несколько независимых конверторов, часть из которых рантайм, а часть
реализована через темплейты, но это малорасширябельно, при добавлении нового фрукта приходится править несколько мест.
Подумалось, мб есть стандартное решение для такой задачи.
C>Обратно — никак. (Т.е. только в run-time.) C>Может все в run-time перевести, упаковав типы из ns_types в boost::variant<...> ?
В учебных целях хотелось бы максимально компил-таймово и без повторений кода.
Здравствуйте, SomeOne_TT, Вы писали:
SO_>Есть три внешние иерархии типов, которые надо маппить друг в друга. SO_>Первая иерархия построена на enum-like int SO_>Третья — весьма странный (не понимаю, зачем?) способ SO_>Задача — написать конвертер, который маппит значение из одной иерархии в другую. SO_>Желаемый интерфейс — что-то вроде SO_>Что ни придумаю — выходят какие-то уродцы, да еще и ns_crap::Fruit как темплейт аргумент применить невозможно, т.к. это не тип и не значение. SO_>Какие есть варианты?
Я вот здесь набросал. Интерфейс сохранил в точности, как ты показал:
Здравствуйте, SomeOne_TT, Вы писали:
SO_>Изящно, да. Но эти макросы Всегда старался быть от них как можно дальше. SO_>Впрочем, за неимением гербовой возьму твой способ. Спасибо!
Ну вот, к сожалению, не хватает C++ описательных возможностей. Какждый раз, когда хочется задать декларативное описание каким-то статическим сущностям, неизбежно упираешься в необходимость использования макросов.