Мне интересно, знает ли кто-нибудь об осуществлении (или попытке реализации) этого.Кто-нибудь пытался реализовать Haskell-подобный оператор-заявление в C++?
В Haskell
Haskell есть выражение, которое выполняет случай различие с помощью сопоставления с образцом:
let a = [1,2,3] in
let is_empty = case a of
[] -> True
(_:_) -> False in
-- Note: is_empty == False
...
В C++
C++ разрешение перегрузки делает что-то подобное сопоставление с образцом. Всегда можно определить набор перегрузок для разграничения типов по типам, но во многих случаях было бы удобнее использовать выражения.
я могу видеть, как это могло бы почти работы в C++ 14:
template<typename Head, typename Tail>
using Cons = boost::tuples::cons<Head, Tail>;
using Nil = boost::tuples::null_type;
template<typename Tuple>
bool is_empty(Tuple const & tuple)
{
return case_of(tuple)(
[](Cons<auto,auto> const &) { return false; }
, [](Nil) { return true; }
);
}
Но я не думаю, что Cons<auto,auto>
(или чего-то подобного) действует в любой версии C++. У нас есть общие лямбды, но в этом случае я хочу сделать вывод аргумента шаблона в лямбда.
Итак, есть ли что-нибудь подобное этому случаю в дикой природе? Или кто-нибудь знает о неудачной попытке?
Или вы можете увидеть, как достичь соответствия шаблону, в котором я собираюсь? Он должен полностью содержаться в выражении.
Если 'boost :: tuples :: cons' является шаблоном (как вы его используете, как позже), вы должны использовать' template <...> using' вместо. Кроме того, что делает 'case_of'? Как это реализовано? – xinaiz
Спасибо. Я исправил декларацию «Против». Вопрос в том, кто-то пытался реализовать что-то вроде case_of. Из кресла представляется правдоподобным, что, учитывая список аргументов и список функций, некоторые метапрограммирование можно использовать для вызова правильного или вызвать ошибку, если вызов неоднозначен. – AndyJost
Из того, что я знаю, лямбда не может быть использована в SFINAE. Дело в том, что выражение должно быть действительным при вызове функции, поэтому, если соответствует только один случай, другие случаи должны быть недействительными, а затем, если они недействительны, возникает ошибка. Вы можете достичь этой функциональности с помощью шаблонов и классического SFINAE, но я сомневаюсь, что кто-то придумает определение в таких областях, как вы хотите это сделать. – xinaiz