Я пытаюсь порт следующий Scala код C++:C++ ограничение на ГОО типов в качестве матрицы параметров
trait Functor[F[_]] {
def map[A, B](fa: F[A])(f: A => B): F[B]
}
Я пытался что-то вроде:
template<template <typename> class F>
struct Functor {
template <typename A, typename B>
static F<B> map(const F<A> &fa, ??? f); // What's the type of `f`?
};
Но я не знаете, как выразить тип f
(который в Scala равен A => B
, или Function1[A, B]
). Использование std::function
делает компилятор не может сделать полезный вывод типов, а также позволяет использовать лямбды неудобных (мне нужно явно указать параметр шаблона, как
Functor<List>::map<Foo, Bar>(foos, [](const Foo &foo) -> Bar { return foo.toBar(); });
, иначе компилятор просто не может сделать вывод, что B
является). Обходной кажется:
template<template <typename> class F>
struct Functor {
template <typename A, typename A2B>
static auto map(const F<A> &fa, A2B f) -> F<decltype(f(fa[0]))>;
};
Но это выглядит некрасиво, и F<A>
не всегда может поддержать оператора скобки (или ::value_type
, по этому вопросу). Есть ли лучший способ реализовать это?
Что означает этот код Scala? –
@ T.C. Например, если у вас есть список 'nums' (типа' List [Int] '), который содержит' 1, 2, 3' и 'Functor [List]', вы можете сделать «Functor [List] .map (nums) (x => (x + 1) .toString) 'и вернуть новый список, содержащий' "2", "3", "4" '. Это похоже на 'std :: transform'. Синтаксис 'F [_]' в основном означает «F» - это тип, который может «содержать» другой тип. –
Вы связаны с C++ 11 или C++ 14? –