Я пытаюсь получить следующую основную функцию для компиляции и работы, как и ожидалось:
int main()
{
auto square = [](int x){ return x*x; };
typedef std::vector<int> Row;
typedef std::vector<Row> Mat;
Mat mat;
auto squareElements = Curry(Map<Row>, square);
Mat squaredMat = Map<Mat>(squareElements, mat);
}
Прямо сейчас мой дополнительный код выглядит так:
#include <algorithm>
#include <functional>
#include <iterator>
#include <vector>
template <typename ContainerOut, typename ContainerIn, typename F>
ContainerOut Map( const F& f, const ContainerIn& xs )
{
ContainerOut ys;
// For performance reason one would use
// ys.reserve( xs.size() )
// and std::back_inserter instead of std::inserter
// if ys is a std::vector.
auto it = std::inserter( ys, end( ys ) );
std::transform( begin( xs ), end( xs ), it, f );
return ys;
}
template <typename Ret, typename Arg1, typename ...Args>
auto Curry( Ret f(Arg1, Args...), Arg1 arg ) -> std::function<Ret(Args...)>
{
return [=]( Args ...args ) { return f( arg, args... ); };
}
и он не компилируется.
Любая идея, как заставить компилятор вывести параметры шаблона?
ContainerOut
дляMap
при вызовеMap
. напримерMap<vector<int>>
, остальные параметры шаблона будут выведены компилятором. - person 0x6773   schedule 14.11.2015ContainerIn
, с небольшим жонглированием. - person Alan Stokes   schedule 14.11.2015ContainerOut
к тому же, что иContainerIn
, только с использованиемContainer
таким образом не помогает. - person Tobias Hermann   schedule 14.11.2015auto squareElements = Curry(Map<Row>, square);
дляMap
, потому чтоCurry
попытается получить указатель на функцию в качестве первого аргумента. НоMap<Row>
не является адресом какой-либо функции. Компилятор не сможет вывести другие параметры шаблона и, следовательно, типRet
вCurry
- person 0x6773   schedule 14.11.2015