Что надо — функция которая может принимать ссылку на некий темплейт
темплейт может быть как простым типом типа инта или дубля, я может быть optional для простых типов ... но они тоже могут быть разные
1. Как определить что тип optional?
2. Как вычленить тип из optional?
Можно решить это в лоб перегрузкой, но хочеться красиво ... хотя может перегрузкой может получиться красивее
Спасибки
Весь мир — Кремль, а люди в нем — агенты
Re: выделить тип из optional который сам template type
Здравствуйте, The Passenger, Вы писали:
TP>Можно решить это в лоб перегрузкой, но хочеться красиво ... хотя может перегрузкой может получиться красивее
ничего не понял. Что может быть красивее и лаконичнее специализации?
Здравствуйте, The Passenger, Вы писали:
TP>Что надо — функция которая может принимать ссылку на некий темплейт TP>темплейт может быть как простым типом типа инта или дубля, я может быть optional для простых типов ... но они тоже могут быть разные
Самое главное: а что дальше хочется с этим сделать?
Эта функция должна как-то единообразно работать и с optional, и с обычными? Или там есть какое-то ветвление?
(здесь и далее пишу без ссылок и форвардов, чтобы не засорять иллюстрацию)
Если такого кода много, пишем функцию высшего порядка
template<class F, class T> void lift_and_run(F f, T v) { f(v); }
template<class F, class T> void lift_and_run(F f, optional<T> p) { assert(p); f(*p); } // ну или как обрабатывать !p ?template<class F, class T> void run_lifted(F f, T v) { f(&v); }
template<class F, class T> void run_lifted(F f, optional<T> p) { f(p); }
// и даже можем просто поднимать функцииauto lift(F f) { return [f](auto arg) { lift_and_run(f, arg); }; }
auto lifted(F f) { return [f](auto arg) { run_lifted(f, arg); }; }
Можем единообразно поднимать аргумент, а функция пусть будет ad-hoc
template<class T> auto as_optional(T& v) { return &v; } // ну, тут уж ссылка пролезла в иллюстрациюtemplate<class T> auto as_optional(optional<T> p) { return p; }
// и кстати, этой функцией можно воспользоваться для поднятия-опускания типаtemplate<class XZ> using add_optional_t = decltype(as_optional(declval<XZ>()));
template<class XZ> using remove_optional_t = remove_ref_t<decltype(*as_optional(declval<XZ>()))>;
template<class XZ> void foo(XZ arg) {
auto p = as_optional(arg);
.....(!p, *p) // дальше всё как с optional
}
template<class XZ> void bar(XZ arg) {
auto p = as_optional(arg);
.....(!p, *p)
}
Вообще можно упороться по поводу труъ хаскельных функторов и монад — сделать fmap, переупаковывать optional<optional<T>> в optional<T>, вот это вот всё...
Сейчас полночь с воскресенья на понедельник, я не особо заботился о строгости проекции плюсов на хаскелл и обратно, просто идею набросил.
Хотя проекция тут очевидна и напрашивается.
Глубина кроличьей норы — на усмотрение тебя, Нео, а я Морфей, у меня лапки, и в каждой лапке по таблетке: одна со снотворным, другая со слабительным.